ber*_*tie 12 back-button jsf-2
问题是:点击浏览器后退按钮会发生什么 - >打开一个已经销毁了viewscoped-managedbean的页面 - >从该页面的commandButton提交一个带有网格记录选择的请求?
我的期望:重新创建关联的viewscope-managebean,接收网格记录选择,并处理它们,就像从不涉及浏览器后退按钮一样.
我的经验:相关的viewscope-managebean不会重新创建,也不会接收网格记录选择.必须重新输入URL,或者在点击浏览器后退按钮后重新输入F5才能再次正常工作.
所以这是成功的场景,所有的bean都是视图编组的bean:
现在,这是涉及浏览器后退按钮的错误情况(从#6开始发生的不同事情):
是否可以使用带有浏览器后退按钮的viewscope-beans获得正常体验(就像没有浏览器后退按钮一样)?
这是我的依赖:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.1.3</version>
<scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
请分享您的想法!
Bal*_*usC 16
浏览器似乎已从其缓存提供页面,而不是向服务器发送完整的HTTP GET请求,而您将JSF状态保存方法设置为server
(这是默认值).
有两种方法可以解决这个问题:
告诉浏览器不要缓存动态JSF页面.您可以借助过滤器来完成此操作.
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
res.setDateHeader("Expires", 0); // Proxies.
}
chain.doFilter(request, response);
}
Run Code Online (Sandbox Code Playgroud)
将过滤器映射到FacesServlet
相同的URL模式.
将JSF状态保存方法设置为client,以便将整个视图状态存储在表单的隐藏字段中,而不是存储在服务器端的会话中.
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)过滤方式是优选的.
归档时间: |
|
查看次数: |
8327 次 |
最近记录: |