我见过类似的问题,但我不认为这是一个转发,因为我可以从WebFilter访问ManagedBean,但奇怪的是更新的属性....并没有真正更新。以下是详细信息:
我有一个过滤器(使用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>
为了完整起见,这里是部分UserInfoView:
@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”(调用UserInfoView setViewMode)将viewMode设置为1
- Facelet获得适当的值
然后只需重新启动Glassfish即可: - 在GET请求中使用“vm = 1” STILL 设置(调用UserInfoView setViewMode)viewMode为1 - Facelet获得--default **值(即0)
我怀疑RESTORE_VIEW阶段会以某种方式将变量重置为默认值,但除了跟踪请求的生命周期之外,我没有任何东西可以支持这个理论......
从Servlet过滤器更改SessionScoped托管bean的变量时,我应该注意什么?我的方法有什么不对吗?
答案 0 :(得分:1)
不是您的问题的答案,但由于您使用的是JSF 2,传递这些参数的更好方法是使用:
<f:viewParam name="vm" value="userInfoView.viewMode"/>