1

我在 Java EE 中有一个带有 JSF、Facelets、Richfaces 的动态 Web 应用程序。我的页面都是 xhtml 页面。所以 JSTL 不能在其中工作。为了使我的帐户页面和所有其他私有页面都可以访问,我想测试用户是否已连接,因此会话中的属性HttpSession是否不为空。如果它为空,则用户在欢迎页面中被重定向。

我在我的 xhtml 页面中尝试过:

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

但由于它不是 jsp 页面,所以它不起作用。那么我应该在哪里测试会话是否不为空以允许用户查看他的私人页面?在中央管理的 bean 中?

4

1 回答 1

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上。url-pattern/private/*/secured/*/restricted/*

<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本身即已经是会话。对于其他检查/维护您的代码的开发人员来说,这将过于模棱两可和令人困惑。

于 2010-06-30T14:46:25.230 回答