如何多次读取request.getInputStream()

我有以下代码:


@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

        throws IOException, ServletException {

    logger.info("Filter start...");


    HttpServletRequest httpRequest = (HttpServletRequest) request;

    HttpServletResponse httpResponse = (HttpServletResponse) response;


    String ba = getBaId(getBody(httpRequest));


    if (ba == null) {

        logger.error("Wrong XML");

        httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);

    } else {      


        if (!clients.containsKey(ba)) {

            clients.put(ba, 1);

            logger.info("Client map : init...");

        } else {

            clients.put(ba, clients.get(ba).intValue() + 1);

            logger.info("Threads for " + ba + " = " + clients.get(ba).toString());

        }


        chain.doFilter(request, response);

    }

}

和此web.xml(缩短了程序包并更改了名称,但外观相同)


<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app>

  <filter>

    <filter-name>TestFilter</filter-name>

    <filter-class>pkg.TestFilter</filter-class>

  </filter>

  <filter-mapping>

    <filter-name>TestFilter</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>


  <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>WEB-INF/applicationContext.xml</param-value>

  </context-param>


  <listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>


  <servlet>

    <servlet-name>Name</servlet-name>

    <display-name>Name</display-name>

    <servlet-class>pkg.Name</servlet-class>

    <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

    <servlet-name>Name</servlet-name>

    <url-pattern>/services/*</url-pattern>

  </servlet-mapping>

</web-app>

我想在过滤器之后调用Servlet。我希望chain.doFilter(...)可以做到这一点,但是我总是会遇到以下错误chain.doFilter(...)


慕斯王
浏览 1612回答 3
3回答

千巷猫影

您可能开始使用getReader()in 使用HttpServletRequest :String ba = getBaId(getBody(httpRequest));&nbsp;您的servlet尝试调用getInputStream()相同的请求,这是不允许的。您需要做的是使用ServletRequestWrapper制作请求正文的副本,因此您可以使用多种方法读取它。我没有时间找到完整的示例,对吧...对不起...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java