所以我遇到了很多与我类似的问题,我开始明白了,直到我意识到我没有,简而言之,这就是故事:
在身份验证 bean 中,身份验证成功应该会导致访问一些 Web 资源,失败应该“过滤”访问并重定向到当前登录页面。现在,在那个认证 bean 中,我在成功的情况下添加了这一行:
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(authentificationBean1.AUTH_STATE, "true") ;
AUTH_STATE在 bean 中定义为:
public static final String AUTH_STATE = "";
如果失败,我会执行以下操作:
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(authentificationBean1.AUTH_STATE, null) ;
现在在过滤器(应用于除身份验证页面之外的每个文件的过滤器)中,我的 doFilter 方法如下所示:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
if (((HttpServletRequest) request).getSession().getAttribute(authentificationBean1.AUTH_STATE) == null) {
((HttpServletResponse) response).sendRedirect("authentification.xhtml");
}
if(((HttpServletRequest) request).getSession().getAttribute(authentificationBean1.AUTH_STATE) != null) {
((HttpServletResponse) response).sendRedirect("accueil.xhtml");
}
}
我的想法是,如果身份验证顺利,authentificationBean1.AUTH_STATE会话属性将设置为非空值,因此在过滤器测试中我将能够重定向到欢迎页面(accueil.xhtml);如果该属性为空,我们将留在身份验证页面。
品尝整个事情:过滤器似乎工作但太多了,我的意思是即使身份验证测试必须成功,它也不允许我通过欢迎页面。没有过滤器它实际上工作得很好,看起来我错过了一些关于使用带有 JSF 或过滤器的过滤器的东西。
PS:没有应用chain.doFilter,因为我没有另一个过滤器可以调用,但怀疑那里有什么东西。
感谢您的指示。
编辑 :
<filter>
<filter-name>RestrictionFilter</filter-name>
<filter-class>beans.RestrictionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RestrictionFilter</filter-name>
<url-pattern>/faces/accueil.xhtml</url-pattern>
</filter-mapping>