当前位置: 首页 > 面试题库 >

Java 会话到期时的授权重定向不适用于提交JSF表单,页面保持不变

申高峰
2023-03-14
问题内容

我正在使用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()单击并执行了该行,没有引发任何异常,但是用户停留在同一页面上。基本上,根本没有视觉变化。

为什么这对页面导航有效,但对表单提交却无效?


问题答案:

你的具体问题很可能是由你引起的,因为你的JSF命令链接/按钮实际上正在发送ajax请求,而该请求又需要特殊的XML响应。如果你要发送重定向作为对ajax请求的响应,那么它将只是将ajax请求重新发送到该URL。反过来,如果没有反馈,此操作将失败,因为重定向URL返回整个HTML页面,而不是特殊的XML响应。实际上,你应该返回一个特殊的XML响应,其中指示JSF ajax引擎更改current window.location

但是实际上你还有更大的问题:使用错误的工具来完成工作。你应该为工作使用一个servlet过滤器,而不是一个本地的servlet,并确保没有哪个可以取代FacesServlet负责所有JSF工作的人员。

假设你在请求/视图范围内的JSF后备bean中执行登录,如下所示(如果你使用的是容器管理的身份验证,请参见使用j_security_check在Java EE / 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命令链接/按钮提交时,这就不起作用了。命中并执行行,没有引发异常,但用户停留在同一页。基本上,没有任何视觉变化。 为什么这在页面导航上有效,而在表单提交上无效?

  • 我在global.asax中尝试了以下代码,但不起作用,并导致Application_Error(“响应在此上下文中不可用。”)。

  • 表单提交成功后,页面不会重定向到感谢页面,在控制台上,我得到了错误响应,因为AMP4Email不支持重定向。请让我知道重定向功能何时工作。 我们正在使用 在Php中,我添加了重定向头

  • 我有一个输入栏,在提交时必须重定向到另一个https页面(包含谷歌搜索)。表格的代码如下所示: 我也添加了amp表单扩展。官方文件说: 提交amp表单后重定向还允许发布者在提交发生后通过amp重定向到响应标题将用户重定向到新页面。 请注意,您还必须更新访问-控制-暴露-报头响应报头,以将AMP重定向到允许报头的列表中。 重定向URL必须是绝对HTTPS URL,否则AMP将抛出错误,重定向将不会发

  • 问题内容: 我已经阅读了所有有关将标头插入php表单文件中以便在提交表单后将用户重定向到另一个URL的文章-但我不知道该怎么做。下面是我的代码。您能告诉我在哪里放置标题/重定向,以便通过电子邮件发送信息,然后用户转到另一个html页面吗? 问题答案: 之后 请注意,您将永远不会看到“感谢您订阅我们的邮件列表” 那应该在下一页上,如果您回显任何文本,则会收到错误消息,因为标头已经被创建;如果您要重定

  • 问题内容: 我正在使用ASP.NET MVC。我想在会话过期时重定向到登录页面。我该如何实现?如果我正在对控制器中的方法进行AJAX调用,那么如果在这种情况下我的会话期满,我也想重定向到登录页面。 问题答案: 您可以通过3种方式做到这一点: 为您的操作创建一个过滤器,并将其应用于OnActionExecuting中的代码编写(在执行操作之前),http://www.asp.net/mvc/tuto