getThreadLocalRequest()。getSession(false)始终为null

时间:2011-07-04 19:01:21

标签: java gwt

我在尝试代码登录+ cookies时遇到一些问题..当用户登录时,我创建了会话

getThreadLocalRequest().getSession(true)

当我想检查它仍然活着的会话是否总是返回null

HttpSession session = getThreadLocalRequest().getSession(false);    
        if (session != null) {
           }

当我检查HttpRequest(当我检查会话活动时),这有

Cookie: JSESSIONID=a1042a8e-9ebc-45b8-a3d8-12161885be96

并且cookie没问题。

我使用Eclipse +开发模式

服务器端代码:

public String login(String rut, String pass) throws AuthenticationException {
    //if UserPassMatch ...

session = this.getThreadLocalRequest().getSession(true);
    //set user bean 
session.setAttribute("beanSession", us);

HttpServletResponse response = getThreadLocalResponse();
Cookie usernameCookie = new Cookie("JSESSIONID", us.getSessionID());
usernameCookie.setPath("/");
usernameCookie.setMaxAge(60 * 60 ); //1 hora
response.addCookie(usernameCookie); 


}

@Override
public String checkIfSessionStillActive(String token) { 

HttpServletRequest request = getThreadLocalRequest();   
    //Here ALWAYS return null   
HttpSession session = request.getSession(false);

if (session != null) {
        //check sessionId and search User Bean 
}

    return token;
}

从客户端来看,没有什么特别的,只需调用checkIfSessionStillActive来检查会话是否存在,如果不存在则抛出令牌或登录。当用户登录时仍返回会话NULL。我使用MVP模式,我从AppController调用,我使用相同的rpcService。一旦用户登录我检查会话并且它存在,但如果我调用checkIfSessionStillActive,则找不到任何会话。 真的,我读了很多代码,我发现它几乎是一样的东西,¿能帮助我吗?

2 个答案:

答案 0 :(得分:1)

您是否正在使用扩展RemoteServiceServlet的子类并调用在其他地方创建的对象(例如在spring上下文中)并且已经扩展了RemoteServiceServlet?如果是,以下将解决您的问题

为每个请求创建一个新的RemoteServiceServlet实例。问题是在RemoteServiceServlet的超类中定义的线程局部变量不是静态的,因此对于每个对象,您有不同的变量。当你在上面的场景中处理调用时,你的请求响应线程局部变量被初始化为接收的对象,但它没有为你正在调用方法的对象设置东西。

我使用了一种解决方法,在调用第二个对象之前创建一个带有静态threadlocal varrible的类并设置值。现在,swcond对象也可以访问它们。

答案 1 :(得分:0)

您是否尝试过使用setMaxInactiveInterval()而不是直接搞乱cookie?