我在尝试代码登录+ 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,则找不到任何会话。 真的,我读了很多代码,我发现它几乎是一样的东西,¿能帮助我吗?
答案 0 :(得分:1)
您是否正在使用扩展RemoteServiceServlet的子类并调用在其他地方创建的对象(例如在spring上下文中)并且已经扩展了RemoteServiceServlet?如果是,以下将解决您的问题
为每个请求创建一个新的RemoteServiceServlet实例。问题是在RemoteServiceServlet的超类中定义的线程局部变量不是静态的,因此对于每个对象,您有不同的变量。当你在上面的场景中处理调用时,你的请求响应线程局部变量被初始化为接收的对象,但它没有为你正在调用方法的对象设置东西。
我使用了一种解决方法,在调用第二个对象之前创建一个带有静态threadlocal varrible的类并设置值。现在,swcond对象也可以访问它们。
答案 1 :(得分:0)
您是否尝试过使用setMaxInactiveInterval()而不是直接搞乱cookie?