我的目标是使用过滤器拦截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,并且我无法添加任何会话变量。 想法?
答案 0 :(得分:0)
getSession()
尝试获取当前会话,如果不存在该会话,则尝试创建一个新会话。 getSession(false)
也会尝试获取该会话,但是如果不存在该会话,则它将返回null(顺便说一句getSession() === getSession(true)
)。这就是使用getSession()
时会出现异常(因为无法创建一个)的原因,而使用getSession(false)
时会出现null
的原因,因为没有会话,也没有尝试创建新会话的原因。 / p>
由于您已经在向客户端发送响应,因此无法向其添加新的http标头,在这一点上为时已晚。不知道您的环境如何,但是您需要尽快进行必要的工作。