2010-06-30 31 views
1

我在JSF,Facelets,Richfaces中使用Java EE中的动态Web应用程序。 我的页面都是xhtml页面。 所以JSTL不在其中。 对于我的账户页面和所有其他私人页面可以访问,我想测试用户是否已连接,因此如果HttpSession中的属性会话不为空。如果它为空,用户会在欢迎页面中重定向。Xhtml页面和HttpSession测试,没有jstl?

我想在我的XHTML页面:

<jstl:if test="${sessionScope['session']==null}"> 
<jstl redirect...> 
</jstl:if>--> 

,但因为它不是JSP页面将无法正常工作。那么我应该在哪里测试会话是否为空以允许用户看到他的私人页面? 在一个中央托管bean?

回答

3

正常的地方是Filter

创建一类implementsjavax.servlet.Filter并在doFilter()方法写以下逻辑:

if (((HttpServletRequest) request).getSession().getAttribute("user") == null) { 
    // Not logged in, so redirect request to login page. 
    ((HttpServletResponse) response).sendRedirect("/login.jsf"); 
} else { 
    // Logged in, so just continue request. 
    chain.doFilter(request, response); 
} 

地图这个滤波器在web.xml上的类似/private/*/secured/*/restricted/*一个url-pattern

<filter> 
    <filter-name>loginFilter</filter-name> 
    <filter-class>com.example.LoginFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>loginFilter</filter-name> 
    <url-pattern>/private/*</url-pattern> 
</filter-mapping> 

如果您在/private文件夹中有专用页面,则将调用此过滤器并相应地处理会话中登录用户的存在。

请注意,我将属性名称session更名为user,因为这样做更有意义。 HttpSession本身已经是会议。对于其他开发人员检查/维护您的代码而言,这会让人觉得太模棱两可,让人感到困惑。

+0

非常感谢你...... 我们已经建议各私人页面上做: 但我喜欢你的方法无论如何,易于维护和更通用的,谢谢... – KitAndKat 2010-06-30 20:38:41