为什么会话变量总是有非空值?

问题描述:

链接有“LoginCheck”在href属性为什么会话变量总是有非空值?

//LoginCheck.java 
protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    HttpSession ses = request.getSession(false); 

    //Redirects to LoginController.java if there is no session 
    if(ses==null){ 
     RequestDispatcher rd = request.getRequestDispatcher("/LoginController"); 
     rd.forward(request, response); 
    }else{ 
     PrintWriter out = response.getWriter(); 
     out.println("Logout to login again!"); 
    } 
} 

但它始终显示“注销重新登录!”即使我首先使会话无效?

+0

是否有任何过滤器或在'processRequest'之前被调用的东西? –

+0

不,netbeans在默认servlet中的唯一更改是processRequest方法中的更改。 –

+0

你见过这个链接吗?认为它可能有助于http://*.com/questions/24677949/why-session-is-not-null-after-session-invalidate-in-java – NaNey

两件事情

第一:如果有可能,总是喜欢客户端重定向到这是/LoginController而调度请求的目标页面。
由于某些容器(如tomcat)存在一些bug,导致目标页面将作为ASCII数据进行响应(只是尝试打印一些utf-8数据并查看它)。
除了这项技术之外,还会使您的业务和代码变得复杂,如果您问我,将难以维护。第二:我建议你不要验证一个会话的nullify状态,因为如果你在其他地方创建它,这个页面会将客户端视为已登录的人,所以你最好将某个属性设置为一个会话,也许像此:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    HttpSession ses=request.getSession();//let it be always created for this 
    boolean logged=ses.getAttribute("logged")==Boolean.TRUE; 
    //Redirects to LoginController.java if there is no session 
    if(logged){ 
     response.sendRedirect("/login-controller"); 
     return;//you cannot do anything with the request/response once it's redirected or forwarded. 
    }else{ 
     PrintWriter out = response.getWriter(); 
     out.print("Logout to login again!"); 
    } 
} 

后来与登录表单设置logged属性作为true,其指示用户已经成功登录。

回到您的问题:
如果您坚持调试存在的代码,您需要检查客户端可能调用哪些可能创建会话的所有路径(servlet,stuffs)。如果你懒惰,你可能有一个会话监听器,并且只需要一个断点或者显示堆栈来查看哪个组件创建会话,如下所示。

public class session_listener implements HttpSessionListener,ServletContextListener { 
    public session_listener() {} 
    @Override public void sessionCreated(HttpSessionEvent se) { 
    //have a break-point and check stack to see who just created the session 
} 
    @Override 
    public void sessionDestroyed(HttpSessionEvent se) { 
    //have a break-point and check stack to see who just destroyed the session 
    } 

    @Override public void contextInitialized(ServletContextEvent sce){} 

    @Override public void contextDestroyed(ServletContextEvent sce) {} 
} 

而且简单的注册听众中web.xml

<web-app ... > 
... 
<listener> 
     <listener-class>arpit.tomar.session_listener</listener-class> 
    </listener> 
... 
</web-app> 

记住无效的会议不会使会话对象为空以相同的要求!没有。响应必须已成功由客户端获取,通知客户端在此之后不发送会话cookie(如果是cookie),所以当您的服务器并发工作时,您可能一次获得n个请求,这些请求都指示同一个会话。