在Filter中从ServletRequest获取会话时出现问题

时间:2019-06-15 23:21:09

标签: java session servlets servlet-filters

我的目标是使用过滤器拦截ServletResponse,并在它显示在网页上之前向其中添加一些自定义html。我还想进行一些计算,并将结果添加到会话变量HashMap中,以便在后续调用中可以访问。

我不知道如何从doFilter方法中的ServletRequest获取会话。这是我的代码:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {    
    CountingServletResponse counter = null;
    try {           
        HttpServletResponse httpResp = (HttpServletResponse) response;
        counter = new CountingServletResponse(httpResp);
        counter.addHeader("UniqueId", String.valueOf(counter.getUniqueId()));
        HttpServletRequest httpReq = (HttpServletRequest) request;
        HttpSession session = httpReq.getSession(); //this throws error
        //I want to add session variable here
        chain.doFilter(request, response);
        counter.flushBuffer(); // Push the last bits containing HTML comment.   
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

getSession所在的行引发

  

java.lang.IllegalStateException:在创建后无法创建会话   响应已提交

,如果我执行getSession(false),那么它将超过该行,但是session == null,并且我无法添加任何会话变量。 想法?

1 个答案:

答案 0 :(得分:0)

getSession()尝试获取当前会话,如果不存在该会话,则尝试创建一个新会话。 getSession(false)也会尝试获取该会话,但是如果不存在该会话,则它将返回null(顺便说一句getSession() === getSession(true))。这就是使用getSession()时会出现异常(因为无法创建一个)的原因,而使用getSession(false)时会出现null的原因,因为没有会话,也没有尝试创建新会话的原因。 / p>

由于您已经在向客户端发送响应,因此无法向其添加新的http标头,在这一点上为时已晚。不知道您的环境如何,但是您需要尽快进行必要的工作。