【问题标题】:problems getting session from ServletRequest in Filter从过滤器中的 ServletRequest 获取会话的问题
【发布时间】:2019-10-30 01:52:37
【问题描述】:

我的目标是使用过滤器拦截 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 并且我无法添加任何会话变量。 想法?

【问题讨论】:

    标签: java session servlets servlet-filters


    【解决方案1】:

    getSession() 尝试获取当前会话,如果它不存在,它会尝试创建一个新会话。 getSession(false) 也尝试获取会话,但如果不存在,则返回 null(顺便说一句,这意味着 getSession() === getSession(true))。这就是为什么getSession() 有异常(因为你不能创建一个),getSession(false)null,因为没有会话,也没有尝试创建一个新的。

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

    【讨论】:

    • 我了解 getSession() 和 getSession(false)。但是直到 chain.doFilter 命令才将响应发送到客户端。在那之前我应该​​可以添加会话变量。
    • 我试图让这篇文章尽可能简单,只使用相关代码。原来问题出在另一段代码中,该代码正在执行 flushBuffer 以获取响应的大小。显然,这也扼杀了会议。如果是这种情况,不确定如何在响应中包含响应的大小。
    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 2015-05-22
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多