【问题标题】:why does the session variable always have a non null value?为什么会话变量总是具有非空值?
【发布时间】:2015-07-22 07:14:25
【问题描述】:

链接在 href 属性中有“LoginCheck”

//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!");
    }
}

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

【问题讨论】:

标签: java servlets


【解决方案1】:

两件事

首先:如果可能,请始终将客户端重定向到目标页面/LoginController,而不是分派请求。
因为某些容器(例如 tomcat)存在一些错误,导致目标页面将被响应为 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 个请求,这些请求都表示同一会话。

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多