我有两个不同的JSF页面,我们假设A。B. jsf和jsf但是都调用相同的托管bean不同的方法ManagedBean.java
。jsf正在调用一个SessionScoped Managed bean方法,其中我在请求类对象
中设置了一些属性HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
request.setAttribute("token", requestToken.getToken());
request.setAttribute("tokenSecret", requestToken.getTokenSecret());
然后像这样重定向到另一边
response.sendRedirect(requestToken.getAuthorizationURL());
现在成功登录后,我正在打开我的网站假设另一个JSF页面b。jsf和从这个页面我调用这样的方法
<f:event listener="#{ManagedBean.redirectLogin2}" type="preRenderView" />
和调用相同的Managedbean但另一个方法
public String redirectLogin2() throws TwitterException {
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
}
但是当我在上面的方法做redirectLogin2()
request.getAttribute("token")
request.getAttribute("tokenSecret")
都给出Null。这里的问题是什么?
请求作用域属性生命周期将在sendRedirect
上丢失。你应该在会话范围上设置值。
HttpSession session=request.getSession();
session.setAttribute("token", requestToken.getToken());
session.setAttribute("tokenSecret", requestToken.getTokenSecret());
将value设置为session后。你可以通过请求访问,比如
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
request.getSession().getAttribute("token");
request.getSession().getAttribute("tokenSecret");
虽然,上面的代码将工作,但这不是良好的做法。JSF有@SessionScoped
注释,这将使您可以通过登录会话访问变量。