在JSF中,HttpServletRequest对象的getAttribute()返回Null

时间:2014-05-29 10:17:17

标签: java jsf jsf-2

我有两个不同的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。出租车是什么问题?

1 个答案:

答案 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注释,该注释将通过登录会话提供您的变量访问。