【问题标题】:why session not getting cleared after browser closed? [duplicate]为什么浏览器关闭后会话没有被清除? [复制]
【发布时间】:2017-12-02 03:10:24
【问题描述】:

我不断得到如下输出:

Inside AuthenticationFilter..
Inside Session!

为什么浏览器关闭后会话没有被清除?我什至在 index.jsp 中也保留了页面 session=false,但仍然无法正常工作。请有人查看下面的代码并帮助我在浏览器窗口关闭后清除会话。

下面是代码:

index.jsp

<%@ page session="false" %>
<%

/* ServletContext context= getServletContext();
RequestDispatcher rd= context.getRequestDispatcher("/login");
rd.forward(request, response); */

response.sendRedirect("login");

%>

loginServlet

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Login servlet.
 */

@WebServlet("/login")
public final class LoginServlet extends HttpServlet {

    private HttpSession session = null;
    private RequestDispatcher rd = null;

    /**
     * Respond to a GET request for the content produced by
     * this servlet.
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are producing
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet error occurs
     */
    @Override
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
      throws IOException, ServletException {

        System.out.println("Inside Login Servlet...");

        PrintWriter out = response.getWriter();
        out.print("<h3> This is login servlet poage ... </h3>");

    }
} 

AuthenticationServlet

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebFilter("/*")
public class AuthenticationFilter implements Filter{

    private HttpSession session = null;

    public void init(FilterConfig arg0) throws ServletException {}  

    public void doFilter(ServletRequest req, ServletResponse resp,  
        FilterChain chain) throws IOException, ServletException {

        System.out.println("Inside AuthenticationFilter..");

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse)resp;

        session = request.getSession(false);
        if(session != null && !session.isNew()) {
            System.out.println("Inside Session!");
        } else {
            getAccessToken(request, response, chain);
            chain.doFilter(request, response);
        }

    }  

    public void destroy() {}  

    private void getAccessToken(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException {

        session = request.getSession();
        System.out.println("Created new  Session!");
    }

}

【问题讨论】:

  • 谁能就上述问题给我建议..

标签: java jsp session servlets servlet-filters


【解决方案1】:

此代码将在 5 分钟后使会话无效。

session.setMaxInactiveInterval(300); // 300 seconds

没有服务器端解决方案来检测浏览器事件。

如果您仍需要检测浏览器关闭,请参考this 线程以获取客户端解决方案。

【讨论】:

    【解决方案2】:

    您无法检测到浏览器何时关闭服务器端。这样做你必须编写一些 javascript 来检测浏览器关闭,然后向你的服务器发出请求以使该用户的会话无效 session.invalidate()

    【讨论】:

      【解决方案3】:

      会话超时在 web.xml 中指定。即使您关闭浏览器,会话也将处于活动状态。 如果你真的需要结束它,你可以使用 javascript onbeforeunload 方法发出请求并调用

      session.invalidate();
      

      【讨论】:

        【解决方案4】:

        浏览器无法“清除”会话变量。他们无法直接访问 $_SESSION。他们可以清除会话 ID cookie,给他们一个全新的空会话,或者您的服务器端代码必须清空 $_SESSION

        【讨论】:

        • 但是会话cookie必须在窗口关闭后清除,对吧?
        猜你喜欢
        • 2020-07-15
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 1970-01-01
        相关资源
        最近更新 更多