我的jsp页面显示了直接写入URL后的最后一个视图

我的jsp页面显示了直接写入URL后的最后一个视图,jsp,jsf,session,Jsp,Jsf,Session,我正在使用JSF1.2开发一个需要用户登录的小页面。用户可能有三个角色中的一个,我应该验证给定用户是否可以访问给定角色的页面 假设管理员是唯一可以访问事务报告的管理员。在ViewTransactionReportBean默认构造函数中,我正在验证以下内容: HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false); LoginBea

我正在使用JSF1.2开发一个需要用户登录的小页面。用户可能有三个角色中的一个,我应该验证给定用户是否可以访问给定角色的页面

假设管理员是唯一可以访问事务报告的管理员。在ViewTransactionReportBean默认构造函数中,我正在验证以下内容:

HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    LoginBean lb = null;
    try {
        lb = (LoginBean)session.getAttribute("loginBean");
        char role = lb.getRole();
        if(role!='A') 
            //Throw an exception to invalidate access
    }//catch here both invalid user or null pointer (not logged in) exceptions
这个bean是请求范围,所以它应该与我发出的每个Http请求一起加载,对吗

让我们测试一下这个场景:我以管理员身份登录。我单击查看交易报告页面。我能看到报告。我点击主页。我单击注销(使用逻辑):

注销后(回到登录页面),通过在浏览器中输入URL直接访问../faces/viewTransactionReport.jsp。我没有显示错误消息,而是看到了整个报告,完全是我在单击Home(注销前)之前离开它的最后一个状态。直到我刷新页面(F5),我才会收到错误消息,说我没有登录或我没有权限

在我尝试调试之后,当我直接在浏览器中输入URL时,我注意到甚至没有调用bean构造函数

但我不知道为什么

我注意到甚至没有调用bean构造函数

该页面显然是从浏览器缓存而不是直接从服务器请求的。执行硬重新加载(Ctrl+F5)应该可以让浏览器实际向服务器发送HTTP请求。您可以在浏览器的内置HTTP流量监视器中跟踪这一点(在Chrome/Firefox>=23/IE>=9中按F12)

实际上,您应该指示浏览器而不是缓存受限制的页面。您可以通过在
doFilter()
方法中使用以下逻辑创建一个简单的servlet过滤器来实现这一点:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setDateHeader("Expires", 0); // Proxies.
    chain.doFilter(req, res);
}
如果您将此筛选器映射到包含受限页面(可能是整个
/faces/*
?)的URL模式上,那么它应该可以为您解决问题:

<filter>
    <filter-name>noCacheFilter</filter-name>
    <filter-class>com.example.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>noCacheFilter</filter-name>
    <url-pattern>/faces/*</url-pattern>
</filter-mapping>

noCacheFilter
com.example.NoCacheFilter
noCacheFilter
/面孔/*

非常感谢!是,浏览器正在从浏览器缓存加载它,因此强制它不存储任何缓存会使它根据需要再次从服务器加载。
<filter>
    <filter-name>noCacheFilter</filter-name>
    <filter-class>com.example.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>noCacheFilter</filter-name>
    <url-pattern>/faces/*</url-pattern>
</filter-mapping>