我定义了一个 PhaseListener 来检查 JSF 项目中的授权。但它不适用于 HTML5。即使我为 web.exml 中的 servlet 映射添加了 url=*.html,它也不适用于 HTML5。因为 JSF2 不支持 HTML5 的一些标签。比如帆布等。
在 JSF 项目中调用 HTML5 文件时如何检查授权?
我定义了一个 PhaseListener 来检查 JSF 项目中的授权。但它不适用于 HTML5。即使我为 web.exml 中的 servlet 映射添加了 url=*.html,它也不适用于 HTML5。因为 JSF2 不支持 HTML5 的一些标签。比如帆布等。
在 JSF 项目中调用 HTML5 文件时如何检查授权?
首先,您根本不应该为工作使用阶段侦听器,而是使用servlet 过滤器。阶段侦听器仅在 JSF 请求上运行,即仅与FacesServlet
. 阶段侦听器是一种笨拙的方法,仅用于授权检查。
这是一个具体的启动示例,说明此类过滤器的外观,假设您已将登录用户存储为User
会话中的对象:
@WebFilter("/*")
public class LoginFilter implements Filter {
@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);
User user = (session != null) ? session.getAttribute("user") : null;
String loginURL = request.getContextPath() + "/login.xhtml";
boolean loginRequest = request.getRequestURI().startsWith(loginURL);
boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER);
if (user != null || loginRequest || resourceRequest)) {
chain.doFilter(request, response);
} else {
response.sendRedirect(loginURL);
}
}
// ...
}