JSF 页面不使用过滤器接口重定向
Posted
技术标签:
【中文标题】JSF 页面不使用过滤器接口重定向【英文标题】:The JSF page ins't redirecting using by Filter interface 【发布时间】:2012-05-10 17:42:48 【问题描述】:我正在开发 jsf 登录和注销较小的 Web 应用程序。我看到了一些问题。我的注销方法没有删除会话并且无法重定向到登录页面。我已经从 ***.com 询问。Matt 用户回答了 Filter 类我。然后我根据Matt研究过滤器和页面缓存。我习惯了过滤器的doFilter()方法,在web.xml文件等中......
这是我的代码:
public class LoginFilter implements Filter
@Override
public void init(FilterConfig config) throws ServletException
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
UserController userController = (UserController) request.getSession().getAttribute("user");
if (userController == null || !userController.isLoggedIn())
response.sendRedirect(request.getContextPath() + "/login.jsf");
else
chain.doFilter(request, response);
@Override
public void destroy()
然后注销()
public String logout()
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext ec = context.getExternalContext();
final HttpServletRequest request = (HttpServletRequest) ec.getRequest();
request.getSession(false).invalidate();
return "logout";
和web.xml配置:
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>org.bis.logic.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
登录后我渲染主页。
<body>
<!--
# session.invalidate();
response.sendRedirect("login.jsf");
-->
<h:panelGrid rendered="#userController.isLoggedIn()">
Hello Mr . #userController.user.name
<br />
<h:form>
<p align="right">
<h:commandLink action="#userController.logout()"value="Logout" />
</p>
</h:form>
</h:panelGrid>
</body>
我的 userController managedBean 类:
@ManagedBean(name = "userController")
@SessionScoped 公共类用户控制器
private User user;
public UserController()
user = new User();
public User getUser()
return user;
public void setUser(User user)
this.user = user;
public static void addErrorMessage(String msg)
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
msg, msg);
FacesContext.getCurrentInstance().addMessage(null, facesMsg);
public String authenticate()
if (user.getName().equals("admin") && user.getPassword().equals(""))
return "success";
else
addErrorMessage(String
.format("Username and Password didn't match !!!"));
return "fail";
页面导航xml:
<navigation-rule>
<from-view-id>/login.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/home.xhtml</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>fail</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/home.xhtml</from-view-id>
<navigation-case>
<from-action>#userController.logout()</from-action>
<from-outcome>logout</from-outcome>
<to-view-id>/index.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
【问题讨论】:
这是一个错误页面图片i.stack.imgur.com/YbkIV.png 【参考方案1】:您的过滤器正在无限重定向循环中运行。 login.jsf
上的请求也会调用过滤器。如果用户仍然没有登录,那么它将重定向回login.jsf
,这又会再次调用过滤器,等等。
基本上有两种方法可以解决这个问题:
确保login.jsf
未被过滤器的 URL 模式覆盖。将所有受保护的页面(除了login.jsf
!)收集在一个单独的文件夹中,如/app
、/secured
、/pages
等,并将过滤器映射到该 URL 模式,例如/app/*
。
添加一个额外的检查来确定请求是否已经在请求登录页面,如果是,则不要再次重定向到它。
String loginURL = request.getContextPath() + "/login.jsf";
boolean loggedIn = userController != null && userController.isLoggedIn();
boolean loginRequest = request.getRequestURI().equals(loginURL);
if (loggedIn || loginRequest)
chain.doFilter(request, response);
else
response.sendRedirect(loginURL);
【讨论】:
![注销后不要重定向到登录页面。在此图像中表示注销后单击浏览器返回按钮。基本检查重定向登录页面][1] [1]:i.stack.imgur.com/VNbEf.png 你需要告诉浏览器不要缓存页面。另请参阅***.com/questions/10305718/… 的具体示例@您甚至可以在已有的过滤器中完成这项工作。 我用的是CacheControllPhaseListenner class.public class Mr.BalusC 我更改为将代码添加到帖子的过滤器类?还是写入新的 NoCacheFilter 类?以上是关于JSF 页面不使用过滤器接口重定向的主要内容,如果未能解决你的问题,请参考以下文章
linuxbingc(IO)系统调用文件接口重定向静态库&动态库软硬链接简单文件系统