如果用户未登录到JSF,重定向到登录页面
我正在开发一个JSF应用程序。 这仅适用于Authourised用户。如果用户未登录到JSF,重定向到登录页面
所以每当有人试图通过URL访问任何页面,它应该重定向到登录。
我使用XHTML作为前端。并使用JSF框架。
而我在会话范围中存储登录Bean。
不幸的是我已经使用Servlets和静态页面“response.sendRedirect()”。
在此先感谢。
我认为一种解决方案是将所有页面放入WEB-INF中,但一个问题是我正在使用resonse.sendRedirect() 以及我正在使用带有facelets的模板。
请给我建议。
在文件夹
"/Common/Login.xhtml"
我的登录页面,并在
"/Admin/*.xhtml"
某些页面,有些页面在
`"Employee/*.ahtml"`
如何设置过滤器,这些2个文件夹管理和员工
我给喜欢这一点,但要求不enering进入过滤器的Servlet
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/faces/Admin/*</url-pattern>
<url-pattern>/faces/Employee/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>`
如果我给这样的
<url-pattern>/*</url-pattern>
其进入无限循环请给您的解决方案,这个概率
我解决了这个问题。 我的过滤器映射
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
和我的Filter类
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
System.out.println("Entered intop Login Filter");
HttpServletRequest req = (HttpServletRequest) request;
LoginBean login = (LoginBean) req.getSession().getAttribute("login");
String path = req.getRequestURI().substring(req.getContextPath().length());
System.out.println("path:" + path);
if (path.contains("/Admin/") || path.contains("/Employee/")) {
if (login != null) {
if (login.getUsername() != null && !login.getUsername().equals("")) {
chain.doFilter(request, response);
} else {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect("/EMS2/faces/Html/Common/Login.xhtml");
}
} else {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect("/EMS2/faces/Html/Common/Login.xhtml");
}
} else {
chain.doFilter(request, response);
}
}
的方式我决定处理这个相同的问题是使用与Spring和Spring Security 3集成的JSF2。一个很好的教程和示例项目可以在这里找到如何适当地做到这一点。
http://technology-for-human.blogspot.com/2010/12/jsf-2-with-spring-3-basics-part-1-of-2.html
如果您不希望春天集成到你的项目那么最好的办法我能想到这样做,这将是实现一个Servlet过滤器,将授权或它到达之前拒绝的HTTP请求FacesServlet的。
<filter>
<filter-name>securityFilter</filter-name>
<filter-class>org.company.filters.SecurityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>securityFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
存在的任何SessionScoped豆可以发现在HttpSession的属性,所以你将能够检索已登录的用户从SessionScoped以这种方式管理的Bean。
此时授权应该很简单。如果登录用户不应该查看此页面,则将用户重定向到未经授权的页面。
我采取了同样的路,你的这个问题。我在SpringSource上发现了来自Mike Weisner的网络研讨会,作为一个提供信息的手表来向我展示该做什么:-) http://www.infoq.com/presentations/Spring-Security-3 – 8bitjunkie 2012-07-24 16:24:20
@ 7SpecialGems整洁的演示...谢谢共享的! – 2012-07-24 16:38:49
你可以用'/Admin/* url-pattern>替换整个'if(path.contains(“/ Admin /”)|| path.contains(“/ Employee /”)){' /Employee/* url-pattern>'而不是'/* url-pattern>'。 –
BalusC
2012-07-24 11:44:56
它不工作 – 2012-07-27 08:57:30