【发布时间】:2013-05-14 21:26:20
【问题描述】:
所以我遇到了很多与我类似的问题,我开始明白了,直到我意识到我没有,简而言之,这就是故事:
在身份验证 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 或过滤器的过滤器的东西。
P.S:没有应用 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>
【问题讨论】:
-
你能发布你的 web.xml 吗?
-
没问题(抱歉迟到了),我会编辑我的初始帖子。
-
我在这里做了几个 System.out,我现在注意到的是,当 AUTH_STATE 为空时,它没有被考虑在内,否则我得到了过滤器在其他情况下工作(其中 AUTH_STATE 不为空)。
-
好的,刚刚注意到 - 我认为您只需要第一个条件 (
.getAttribute(authentificationBean1.AUTH_STATE) == null)。第二个可能会导致无限循环。据我了解,第二个是针对经过身份验证的用户的情况,因此您不必将他/她重定向到任何地方。 -
实际上,目前对我来说是 != null 条件。但我可以看到,如果失败,我不必重定向他......
标签: security jsf login servlet-filters