在JSF 2.0中显示受保护页面回发的用户信息

时间:2011-08-23 14:55:18

标签: security jsf-2

我有一个左边有一个div的JSF应用程序,它在主页面上显示登录用户的用户名。

我将登录的用户信息存储在sessionScoped托管bean中。

我在主页上有几个受保护的页面,我使用容器管理的JDBC领域。

如果用户在没有登录的情况下直接点击链接,容器管理的安全性就会启动并要求用户登录,这很好。

现在,如果用户点击后退按钮,浏览器将显示主页面。现在我如何在此处显示用户名,因为我的托管bean尚未被触发。

此外,浏览器似乎缓存页面并从服务器请求页面。任何人都可以解释一下。

谢谢, Goutham

1 个答案:

答案 0 :(得分:1)

禁用动态JSF页面的浏览器缓存。创建filter映射到*.xhtml并在doFilter()方法中执行以下作业:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpReq = (HttpServletRequest) request;
    HttpServletResponse httpRes = (HttpServletResponse) response;

    if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
        httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        httpRes.setDateHeader("Expires", 0); // Proxies.
    }

    chain.doFilter(request, response);
}

这样,浏览器就会强制发送完整的HTTP请求,而不是从浏览器缓存中显示该页面。

为了显示容器管理安全性的用户登录名,我只需使用#{request.remoteUser}代替。

<h:outputText value="Welcome, #{request.remoteUser}!" rendered="#{not empty request.remoteUser}" />
<h:link value="Login" outcome="login" rendered="#{empty request.remoteUser}" />