我正在使用JSF2。我已经实现了这样的自定义面孔servlet:
public class MyFacesServletWrapper extends MyFacesServlet {
// ...
}
其中,我正在进行一些授权检查,并在用户未登录时发送重定向:
public void service(ServletRequest request, ServletResponse response) {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (...) {
String loginURL = req.getContextPath() + "/LoginPage.faces";
res.sendRedirect(loginURL);
}
}
当用户尝试导航到另一个页面时,此操作有效。但是,当JSF表单通过JSF命令链接/按钮提交时,这就不起作用了。命中并执行行sendReDirect()
,没有引发异常,但用户停留在同一页。基本上,没有任何视觉变化。
为什么这在页面导航上有效,而在表单提交上无效?
FacesContext。getCurrentInstance()。getExternalContext()。重定向(“newpage.xhtml”);试试这个。。。。代替res.sendredirect(cpath)。
您的具体问题最有可能是因为您的JSF命令链接/按钮实际上正在发送一个ajax请求,该请求反过来需要一个特殊的XML响应。如果您发送重定向作为对ajax请求的响应,那么它只是将ajax请求重新发送到该URL。如果没有反馈,这反过来会失败,因为重定向URL返回整个超文本标记语言页面,而不是特殊的XML响应。实际上,您应该返回一个特殊的XML响应,其中JSF ajax引擎被指示更改当前的window.location
。
但实际上,你还有更大的问题:在工作中使用错误的工具。您应该为作业使用servlet过滤器,而不是一个自行开发的servlet,当然也不能取代负责所有JSF工作的FacesServlet
。
假设您在请求/视图范围的JSF支持bean中执行登录,如下所示(如果您使用容器托管身份验证,请参阅使用j_security_check在JavaEE/JSF中执行用户身份验证的第二个示例):
externalContext.getSessionMap().put("user", user);
然后,过滤器的启动示例应执行以下操作:
@WebFilter("/*") // Or @WebFilter(servletNames={"facesServlet"})
public class AuthorizationFilter implements Filter {
private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<partial-response><redirect url=\"%s\"></redirect></partial-response>";
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String loginURL = request.getContextPath() + "/login.xhtml";
boolean loggedIn = (session != null) && (session.getAttribute("user") != null);
boolean loginRequest = request.getRequestURI().equals(loginURL);
boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER + "/");
boolean ajaxRequest = "partial/ajax".equals(request.getHeader("Faces-Request"));
if (loggedIn || loginRequest || resourceRequest)) {
if (!resourceRequest) { // Prevent browser from caching restricted resources. See also https://stackoverflow.com/q/4194207/157882
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
}
chain.doFilter(request, response); // So, just continue request.
}
else if (ajaxRequest) {
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
response.getWriter().printf(AJAX_REDIRECT_XML, loginURL); // So, return special XML response instructing JSF ajax to send a redirect.
}
else {
response.sendRedirect(loginURL); // So, just perform standard synchronous redirect.
}
}
// ...
}
问题内容: 我正在使用JSF2。我已经实现了一个自定义面孔servlet,如下所示: 其中我正在做一些授权检查,并在用户未登录时发送重定向: 当用户尝试导航到另一个页面时,此方法有效。但是,当通过JSF命令链接/按钮提交JSF表单时,这不起作用。单击并执行了该行,没有引发任何异常,但是用户停留在同一页面上。基本上,根本没有视觉变化。 为什么这对页面导航有效,但对表单提交却无效? 问题答案: 你的具
表单提交成功后,页面不会重定向到感谢页面,在控制台上,我得到了错误响应,因为AMP4Email不支持重定向。请让我知道重定向功能何时工作。 我们正在使用 在Php中,我添加了重定向头
我在global.asax中尝试了以下代码,但不起作用,并导致Application_Error(“响应在此上下文中不可用。”)。
我有一个输入栏,在提交时必须重定向到另一个https页面(包含谷歌搜索)。表格的代码如下所示: 我也添加了amp表单扩展。官方文件说: 提交amp表单后重定向还允许发布者在提交发生后通过amp重定向到响应标题将用户重定向到新页面。 请注意,您还必须更新访问-控制-暴露-报头响应报头,以将AMP重定向到允许报头的列表中。 重定向URL必须是绝对HTTPS URL,否则AMP将抛出错误,重定向将不会发
所以首先,当我使用时,这段代码是有效的。但是一旦我将其更改为它就停止工作。我是新来的,所以我不确定问题会从哪里来。我想做的就是为我的数据库节省时间。 错误是: 这是我映射到表单的对象: 这是我的控制器: 这是超文本标记语言形式:
我打算使用paramiko在远程主机上运行几个命令,但ssh会话在运行一个命令后关闭。 下面列出的代码: 那么有什么方法可以阻止ssh会话关闭吗?或者帕拉米科的替代品? 有什么方法可以让paramiko ssh会话一直处于活动状态吗? paramiko调试模式信息返回如下: 启动线程(客户端模式):0x2657E10L 已连接(版本1.99,客户端组件-5.20) kex ALGOS:[u'dif