SessionScoped Managed Bean 值未从 Servlet Filter 更改



我见过类似的问题,但我认为这不是重新发布,因为我可以从 WebFilter 访问托管豆,但奇怪的是更新的属性......并没有真正更新。以下是详细信息:

我有一个过滤器可以做到这一点(在Glassfish 3.1.2上使用Mojarra 2.1.6,WebFilter注释):

public void doFilter(ServletRequest request, ServletResponse response,
              FilterChain chain)
       throws IOException, ServletException {
    // FacesContextHelper is a utility class to get some Faces stuff
    FacesContextHelper facesContextHelper = new FacesContextHelper();
    // this returns the correct instance of a SessionScoped ManagedBean
    userInfoView = (UserInfoView) facesContextHelper.getManagedBean(request,
       response, "userInfoView", UserInfoView.class);
    // ... some computation here to get the 'vm' URL parameter
    userInfoView.setViewMode(viewMode);
    // ....
    chain.doFilter(request, response);
}

现在在 Facelet 中,我正在使用这个viewMode

<h:panelGroup layout="block" rendered="#{userInfoView.viewMode ne 1}">
  <ui:include src="/WEB-INF/jsf/v2/products.xhtml"/>
</h:panelGroup>

为了完整起见,这里有一个部分的用户信息视图:

@ManagedBean(name = "userInfoView")
@SessionScoped
public class UserInfoView extends AbstractView
   implements ServiceConstant, Serializable {
 private Integer viewMode = 0;
 public Integer getViewMode() {
   return viewMode;
 }
 public void setViewMode(Integer viewMode) {
   this.viewMode = viewMode;
 }
}

现在发生的事情是,由于某种原因(它似乎与 JSESSIONID 相关联),我将有预期的行为:
- 在 GET 请求集中具有"vm=1"(调用用户信息视图设置视图模式)将视图模式设置为 1
- 小面获得适当的值

然后只需重新启动 Glassfish 并:
- 在 GET 请求中仍然将"vm=1"设置为(调用用户信息视图设置视图模式)视图模式设置为 1
- Facelet 获取 --default** 值(即 0)

我怀疑RESTORE_VIEW阶段以某种方式将变量重置为默认值,尽管除了跟踪请求的生命周期之外,我没有任何支持该理论的东西......

从 Servlet 过滤器更改 SessionScoped 托管 Bean 的变量时,我应该注意什么吗?我的方法有什么问题吗?

不是您问题的答案,但是由于您使用的是 JSF 2,因此传递这些参数的更好方法是使用:

<f:viewParam name="vm" value="userInfoView.viewMode"/> 

相关内容

  • 没有找到相关文章

最新更新