У меня есть приложение 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), как это можно исправить?
Большое спасибо.