栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

你的具体问题很可能是由你引起的,因为你的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.        }    }


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/441762.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号