当前位置: 首页 > 知识库问答 >
问题:

从筛选器中的ServletRequest获取会话时出现问题

夏理
2023-03-14

我的目标是用过滤器截获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的行抛出

JAVAlang.IllegalStateException:在提交响应后无法创建会话

如果我做了getSession(false),那么它将通过该行,但是session==null,并且我不能添加任何会话变量。思想?

共有1个答案

南宫浩皛
2023-03-14

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

由于您已经在向客户端发送响应,因此无法向其添加新的http头,此时为时已晚。不知道你在这里的环境是什么,但你需要尽快完成必要的工作。

 类似资料:
  • 问题内容: 我需要通过过滤器访问会话变量。我什至不知道是否可能。实际上,问题在于实现的方法类型是,而HttpServlet继承了类,而doPost方法的参数是HttpServletRequest。 我可以在ServletRequest的过滤器中访问会话吗? 我应该那样做吗? 你能推荐我什么? 谢谢! 问题答案: 只需将获得的内容转换为即可。

  • 所以我使用express作为我的客户端应用程序的简单后端。当试图向下面的endpointGET /urls发出请求时,它不断收到此消息。 我的快递服务器看起来像这样 在我的Web应用程序中,我使用的是一个提取器,我快速输入,因此它可能是其中不太正确的东西。 这是我的软件包的副本,json以防万一它的待办事项与版本问题 任何帮助将不胜感激,克里斯。

  • 在我的项目中,我使用以下方法从会话中存储和获取数据。 要写入数据: 要读取数据: 2天前,我把我的代码转移到其他一些实时服务器。现在这个服务器在

  • 问题内容: 我正在尝试编写一个可以检索请求URL的过滤器,但是我不确定该怎么做。 这是我到目前为止的内容: 当我在服务器上点击页面时,唯一看到的输出是“ Url:null”。 从过滤器中给定的ServletRequest对象获取请求的URL的正确方法是什么? 问题答案: 这是您要找的东西吗? 重建: 和的信息。

  • 问题内容: 这是我的模样 我试图在线查找有关如何从请求中获取价值的信息。 我什么也没找到,所以我尝试枚举,并且一无所知,但是没有任何标题。 问题 如何获得来自请求的所有标头? 问题答案: 类型转换成(仅当是一个 )。 然后可以使用和方法。 像这样: