Я разрабатываю приложение Spring Boot (с Spring Security) и должен добавить заголовки по умолчанию (в частности, контент-тип и длину содержимого) в запросы, нацеленные на конечную точку/API/V1/MPOS/Set-Token, когда эти заголовки отсутствуют. Чтобы достичь этого, я написал пользовательский фильтр, который расширяет OncePerquestFilter и завершает входящий httpservletRequest, чтобы я мог читать и кэшировать его тело. Я использую следующий код: < /p>
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SetTokenDefaultHeadersFilter extends OncePerRequestFilter {
private static final String DEFAULT_CONTENT_TYPE = "application/json";
private static final String TARGET_URI = "/api/v1/mpos/set-token";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if (TARGET_URI.equals(request.getRequestURI())
&& "POST".equalsIgnoreCase(request.getMethod())
&& (request.getHeader("Content-Type") == null || request.getHeader("Content-Length") == null)) {
HttpServletRequest wrappedRequest = new HttpServletRequestWrapper(request) {
private final byte[] cachedBody = toByteArray(request.getInputStream());
private byte[] toByteArray(InputStream input) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
return baos.toByteArray();
}
@Override
public ServletInputStream getInputStream() {
final ByteArrayInputStream bais = new ByteArrayInputStream(cachedBody);
return new ServletInputStream() {
@Override
public int read() {
return bais.read();
}
@Override
public boolean isFinished() {
return bais.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
// Not implemented
}
};
}
@Override
public BufferedReader getReader() {
return new BufferedReader(new InputStreamReader(getInputStream(), StandardCharsets.UTF_8));
}
@Override
public int getContentLength() {
return cachedBody.length;
}
@Override
public long getContentLengthLong() {
return cachedBody.length;
}
@Override
public String getHeader(String name) {
if ("Content-Type".equalsIgnoreCase(name)) {
String header = super.getHeader(name);
return header == null ? DEFAULT_CONTENT_TYPE : header;
}
if ("Content-Length".equalsIgnoreCase(name)) {
String header = super.getHeader(name);
return header == null ? String.valueOf(cachedBody.length) : header;
}
return super.getHeader(name);
}
};
filterChain.doFilter(wrappedRequest, response);
} else {
filterChain.doFilter(request, response);
}
}
}
< /code>
Я проверил (посредством ведения журнала и фильтрации), что мой фильтр зарегистрирован с самым высоким приоритетом и должен работать в первую очередь. Однако, когда я называю input.read (буфер), он немедленно возвращает -1 (то есть EOF), а кэшированное тело представляет собой пустой массив. Журналы указывают на то, что мой фильтр находится перед ними. < /p>
Мои вопросы: < /p>
Что может потреблять корпус запроса, прежде чем мой фильтр даже получит шанс прочитать его? кэшируйте тело запроса перед какой -либо обработкой?>
Подробнее здесь: https://stackoverflow.com/questions/795 ... -already-c
Пользовательский OncePerrequestFilter читает пустое тело запроса - почему тело уже потребляется? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Код включения повышения скорости не работает. Предмет усиления не потребляется
Anonymous » » в форуме C# - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Код включения повышения скорости не работает. Предмет усиления не потребляется
Anonymous » » в форуме C# - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Код включения повышения скорости не работает. Предмет усиления не потребляется
Anonymous » » в форуме C# - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Пустое тело запроса на пост в контроллере GO, но в JavaScript это правильно
Anonymous » » в форуме Javascript - 0 Ответы
- 188 Просмотры
-
Последнее сообщение Anonymous
-