当我在HandlerInterceptorAdapter中获取InputStream时出现错误400错误的请求

时间:2018-12-06 15:50:30

标签: java spring tomcat interceptor http-status-code-400

我想在Request中获取条目主体的JSON,为此,我使用HttpServletRequestWrapper通过此处的注释指导我。

当我使用此tomcat服务器时,该问题返回400 Bad Request错误,但日志中什么也没有显示,我不知道为什么它不起作用。

这是我的代码。

我的RequestWrapper别名RequestWrapperAccess

public class RequestWrapperAccess extends HttpServletRequestWrapper {

    private final String body;

    public RequestWrapperAccess(HttpServletRequest request) throws IOException {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
            InputStream inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {
            throw ex;
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException ex) {
                    throw ex;
                }
            }
        }
        body = stringBuilder.toString();
    }

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

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

    public String getBody() {
        return this.body;
    }

}

我的InterceptorHandler别名AuthInterceptorAccess

public class AuthInterceptorAccess extends HandlerInterceptorAdapter {

    @Autowired
    TokenUtils tokenUtils;

    @Autowired
    ObjectMapper mapper;

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {

        super.afterCompletion(request, response, handler, ex);
    }

    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // TODO Auto-generated method stub
        super.afterConcurrentHandlingStarted(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        RequestWrapperAccess wrapper = new RequestWrapperAccess(request);

        UserDomain credenciales = mapper.readValue(wrapper.getBody(), UserDomain.class);

        if (credenciales.getUsername() == null || credenciales.getUsername().isEmpty()
                || credenciales.getPassword() == null || credenciales.getPassword().isEmpty()) {
            response.setStatus(HttpStatus.FORBIDDEN.value());
            response.getWriter().write(mapper
                    .writeValueAsString(new ResponseMessage("Parametros faltantes", HttpStatus.BAD_REQUEST.value())));
            return false;
        }

        return true;
    }

}

Eclipse调试我认为一切正常

Debug eclipse

邮递员回应

Postman

Tomcat日志

Log Tomcat

0 个答案:

没有答案