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

getThreadLocalRequest().getSession(true)


当我想检查会话是否仍然存在时总是返回null

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


当我检查HttpRequest时(当我检查会话是否存在时),这有

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


饼干还可以。

我使用Eclipse + Development模式

服务器端代码:

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,则找不到任何会话。
确实,我读了很多代码,发现几乎相同的东西,有什么可以帮助我的吗?

最佳答案

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

对于每个请求,都会创建一个RemoteServiceServlet的新实例。问题在于,在RemoteServiceServlet的超类中定义的线程局部变量不是静态的,因此对于每个对象,您都有不同的变量。在上述情况下,无论何时处理调用,您的请求响应线程局部变量都会为接收的对象初始化,但不会为您要在其上调用方法的对象设置任何东西。

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

关于java - getThreadLocalRequest()。getSession(false)始终为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6575185/

10-10 05:32