我有一个左边有一个div的JSF应用程序,它在主页面上显示登录用户的用户名。
我将登录的用户信息存储在sessionScoped托管bean中。
我在主页上有几个受保护的页面,我使用容器管理的JDBC领域。
如果用户在没有登录的情况下直接点击链接,容器管理的安全性就会启动并要求用户登录,这很好。
现在,如果用户点击后退按钮,浏览器将显示主页面。现在我如何在此处显示用户名,因为我的托管bean尚未被触发。
此外,浏览器似乎缓存页面并从服务器请求页面。任何人都可以解释一下。
谢谢, Goutham
答案 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}" />