java.lang.IllegalStateException: getInputStream () уже был вызван для этого запроса при реализации фильтров - PullRequest
0 голосов
/ 03 января 2019

У меня есть приложение весенней загрузки, в котором я хочу вызвать фильтр на основе URL.

@Bean
public FilterRegistrationBean filter1() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setName("filter1");
    Filter1 filter1 = new Filter1();
    registrationBean.setFilter(filter1);
    registrationBean.setOrder(1);
    registrationBean.addUrlPatterns("/path1/path2");
    return registrationBean;
}

Мой фильтр1 выглядит следующим образом:

public class Filter1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // Do required action
    }

    @Override
    public void destroy() {  }
}   

Мой метод управления следующий:

@RequestMapping(value="/path1/path2", method = RequestMethod.POST)
public ResponseEntity<?> processFile(@RequestParam("file") MultipartFile file) {
    //......
}

Я хочу, чтобы фильтр Filter1 вызывался, когдаВыше API вызывается.Но я получаю следующее исключение:

java.lang.IllegalStateException: getInputStream() has already been called for this request
    at org.apache.catalina.connector.Request.getReader(Request.java:1205)
    at org.apache.catalina.connector.RequestFacade.getReader(RequestFacade.java:504)
    at javax.servlet.ServletRequestWrapper.getReader(ServletRequestWrapper.java:225)
    at javax.servlet.ServletRequestWrapper.getReader(ServletRequestWrapper.java:225)
    at com.merck.nextconnect.authfilter.CustomRequestWrapper.getReader(CustomRequestWrapper.java:46)
    at com.merck.nextconnect.authfilter.InjectionFilter.doFilter(InjectionFilter.java:67)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at com.merck.nextconnect.authfilter.LogMdcFilter.doFilter(LogMdcFilter.java:36)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)

Поэтому я попытался реализовать пользовательский ServletRequestWrapper, как показано ниже:

public class WrappedRequest extends ServletRequestWrapper {
    private String _body;
    private HttpServletRequest _request;

    public WrappedRequest(HttpServletRequest request) throws IOException {
        super(request);
        _request = request;

        _body = "";
        try (BufferedReader bufferedReader = request.getReader()) {
            String line;
            while ((line = bufferedReader.readLine()) != null)
                _body += line;
        }
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(_body.getBytes());
        return new ServletInputStream() {
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }

            @Override
            public boolean isFinished() {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public boolean isReady() {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void setReadListener(ReadListener listener) {
                // TODO Auto-generated method stub

            }
        };
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }
}

Я все еще получаю то же исключение.Управление вообще не идет в WrappedRequest.Я нашел много решений для вышеупомянутого исключения, но ни одно не работало в моем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...