Session jsf2.0中的会话管理
我对JSF2.0中如何管理会话感到困惑 我创建了4个页面,其中包含登录名、数据、信息和sessionexpires,显示会话过期后的情况 当我单击注销按钮时,它通过调用以下操作方法使会话无效: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"; } 正如预期的
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页面(因为我使会话无效),但不要在点击该按钮时执行操作