переданный ответ http ответ сервлета весной Java всегда - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть приложение Spring, и после него у меня есть фильтр.

Мой код:

 @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        if (response.getCharacterEncoding() == null) {
            response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
        }
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        try {

            allowAccess = checkEncryption(httpServletRequest, httpServletResponse); // it returns a boolean Value

            if (allowAccess) {
                String bodyContent =
                        Utils.parseInputStreamToString(httpServletRequest.getInputStream());


                String body = decryptMessage(bodyContent); // decrypt the message using some algorithm


                HttpServletRequestWritableWrapper httpServletRequestWritableWrapper =
                        new HttpServletRequestWritableWrapper(httpServletRequest,
                                body.getBytes());

                HttpServletResponseReadableWrapper responseWrapper =
                        new HttpServletResponseReadableWrapper(httpServletResponse);


                httpServletRequestWritableWrapper.addHeader(HEADER_TRANSACTION_ID,
                        Long.toString(System.currentTimeMillis()) + UUID.randomUUID().toString());

                chain.doFilter(httpServletRequestWritableWrapper, responseWrapper);

                String encryptedResponse = encryptResponseContent(
                        new String(Hex.encode(responseWrapper.getResponseBody())), publicServerKey);

                LOGGER.info("Encrypted Response = " + encryptedResponse + "\n commites:"
                        + httpServletResponse.isCommitted() + ", " + responseWrapper.isCommitted());

                if (!httpServletResponse.isCommitted()) {
                    httpServletResponse.setContentType(MediaType.TEXT_PLAIN_VALUE);
                    httpServletResponse.resetBuffer();
                    httpServletResponse.getOutputStream().write(encryptedResponse.getBytes());
                    httpServletResponse.getOutputStream().close();
                }
            } else {
                LOGGER.info("Invalid Access!!");
                if (!httpServletResponse.isCommitted())
                    httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED,
                            ERROR_MESSAGE_INVALID_PERMISSION);
            }
        } catch (Excetion e) {
            LOGGER.info(""+e);
        } 
    }

У меня есть запрос с неверным запросом, который возвращает мне 401 неавторизованный запрос, но если я изменю свой запрос на правильный запрос и вызову свой фильтр, у меня всегда будет httpServletResponse.isCommitted() = true после первого вызова.

Мне нужно каждый раз отправлять правильный ответ в зависимости от запроса (если я меняю свойзапрос, почему появляется commit = true), как это можно исправить?

Большое спасибо.

...