我有两个不同的JSF页面让我们假设 A.jsf 和 B.jsf 但是两者都调用相同的托管bean不同的方法ManagedBean.java
A.jsf 正在调用SessionScoped托管bean方法,我在Request类对象中设置了一些属性
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。出租车是什么问题?
答案 0 :(得分:1)
请求范围属性生命周期将在sendRedirect
上丢失。您应该在会话范围上设置值。
HttpSession session=request.getSession();
session.setAttribute("token", requestToken.getToken());
session.setAttribute("tokenSecret", requestToken.getTokenSecret());
将值设置为会话后。您可以从请求中访问
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
request.getSession().getAttribute("token");
request.getSession().getAttribute("tokenSecret");
虽然上面的代码可行,但这不是好习惯。 JSF具有@SessionScoped
注释,该注释将通过登录会话提供您的变量访问。