Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session jsf2.0中的会话管理_Session_Jsf 2 - Fatal编程技术网

Session jsf2.0中的会话管理

Session jsf2.0中的会话管理,session,jsf-2,Session,Jsf 2,我对JSF2.0中如何管理会话感到困惑 我创建了4个页面,其中包含登录名、数据、信息和sessionexpires,显示会话过期后的情况 当我单击注销按钮时,它通过调用以下操作方法使会话无效: public String logout(){ FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); return "logout?faces-redirect=true"; } 正如预期的

我对JSF2.0中如何管理会话感到困惑

我创建了4个页面,其中包含登录名、数据、信息和sessionexpires,显示会话过期后的情况

当我单击注销按钮时,它通过调用以下操作方法使会话无效:

public String logout(){
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "logout?faces-redirect=true";
}
正如预期的那样,代码会将我重定向到注销页面,但当我单击浏览器的后退按钮时,它会将我带到数据页面并显示所有信息,但我认为,如果会话已过期,则应该显示sessionexpires页面


如何实现所需的功能?

即使在服务器上的会话无效后,浏览器仍会将您带回数据页,这是因为页面缓存在浏览器内存中

了解浏览器的“后退”按钮的工作原理


您可以参考解决问题的方法。

即使在服务器上的会话无效后,浏览器仍会将您带回数据页,因为该页已缓存在浏览器内存中

了解浏览器的“后退”按钮的工作原理


您可以参考解决问题的方法。

当用户单击浏览器的“后退”按钮时,您会看到以前的页面,这表明这些页面是缓存的,并且是从浏览器的缓存中显示的,而不是从服务器请求的。要解决这个问题,您需要适当地设置HTTP响应头。这一点在本书中已经预先得到了回答。重复一下BalusC,这些是:

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.
设置这些标题最合适的地方是web过滤器,因为您似乎不需要任何JSF属性。您可以在的答案中找到更多信息。要重复BalusC的代码,您需要:

@WebFilter("/secured/*")
public class NoCacheFilter implements Filter {

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

        if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            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);
    }

    // ...

}
只是别忘了告诉你需要过滤哪些页面。这样,请求的新页面将始终从服务器发送,不再缓存。所以,如果用户在注销后试图访问一个安全页面(通过会话失效和发送重定向),您的标准安全方法将启动(其他过滤器),阻止用户访问这些页面

接下来要做的是解释JSF如何在会话无效/超时时处理已经打开的页面。换句话说,您如何处理
viewexpiredeexception
s。对于同步POST请求和AJAX请求,依次在和中回答这一问题

基本上,对于前者,您需要在web.xml中添加以下行:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/expired.xhtml</location>
</error-page>

javax.faces.application.ViewExpiredException
/expired.xhtml

对于后者,我强烈建议您查看JSF实用程序库及其为此目的而设计的功能。

当用户单击浏览器的“后退”按钮时,您会看到以前的页面,这表明这些页面是缓存的,并且是从浏览器的缓存中显示的,而不是从服务器请求的页面。要解决这个问题,您需要适当地设置HTTP响应头。这一点在本书中已经预先得到了回答。重复一下BalusC,这些是:

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.
设置这些标题最合适的地方是web过滤器,因为您似乎不需要任何JSF属性。您可以在的答案中找到更多信息。要重复BalusC的代码,您需要:

@WebFilter("/secured/*")
public class NoCacheFilter implements Filter {

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

        if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            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);
    }

    // ...

}
只是别忘了告诉你需要过滤哪些页面。这样,请求的新页面将始终从服务器发送,不再缓存。所以,如果用户在注销后试图访问一个安全页面(通过会话失效和发送重定向),您的标准安全方法将启动(其他过滤器),阻止用户访问这些页面

接下来要做的是解释JSF如何在会话无效/超时时处理已经打开的页面。换句话说,您如何处理
viewexpiredeexception
s。对于同步POST请求和AJAX请求,依次在和中回答这一问题

基本上,对于前者,您需要在web.xml中添加以下行:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/expired.xhtml</location>
</error-page>

javax.faces.application.ViewExpiredException
/expired.xhtml

对于后者,我强烈建议您查看JSF实用程序库及其为此目的而设计的功能。

谢谢@joe,但这不是我的问题,我知道页面是缓存的,正如我从BalusC那里学到的,但是在后面的页面上,如果我单击任何命令按钮,它应该会将我带到sessionexpire页面,但不是通过该按钮请求页面。谢谢@joe,但这不是我的问题,我知道页面是缓存的,正如我从BalusC中学到的,但是在后面的页面上,如果我单击任何命令按钮,它会将我带到sessionexpire页面,但不是通过该按钮请求页面。可能重复感谢alot@BalusC,但我的问题仍然不是单击后退按钮时的缓存页面,而是在缓存页面上,如果我使Thanke alot@BalusC的会话无效,为什么在单击命令按钮时执行操作,但我的问题仍然不是单击后退按钮时的缓存页面,但是在缓存页面上,如果我正在使sessiontanks alot@skuntsel无效,为什么会在单击命令按钮时执行操作,但我仍然试图做的是,当用户单击缓存页面上的命令按钮时,它应该进入sessionexpires页面(因为我使会话无效),但不要在点击该按钮时执行操作Tanks alot@skuntsel,但我仍然试图做的是当人们点击该缓存页面命令按钮时,它应该进入sessionsexpires页面(因为我使会话无效),但不要在点击该按钮时执行操作