![](/img/trans.png)
[英]How to get Response Body from servletResponse in Spring Boot Filter
[英]How can we get and set response body in Spring Boot Filter
我有一個 Spring MVC 應用程序,它返回 ResponseEntity 和 clientResponse object 作為響應正文
@RestController
public class XxxController {
public void ResponseEntity(ClientRequest clientRequest) {
...
return ResponseEntity.ok(clientResponse);
}
}
但是我們如何才能獲得 clientResponse object 或在 Spring 引導過濾器中設置新的響應體?
@Component
public class MyClassFilter implements Filter {
@Override
public void doFilter( HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
不確定在過濾器中獲取響應是什么意思。 在過濾器中,請求尚未傳遞到 controller,因此還沒有響應。 你可以得到請求。 但請注意不要讀取請求,因為在這種情況下,請求 stream 將在過濾器中讀取,當它到達 controller 時,整個請求 stream 將已被讀取。 要設置響應,您可以執行以下操作:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
response.resetBuffer();
response.setStatus(HttpStatus.OK);
response.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
response.getOutputStream().print(new ObjectMapper().writeValueAsString(myData));
response.flushBuffer(); // marks response as committed -- if we don't do this the request will go through normally!
}
你可以在這里看到為什么你必須刷新響應。 你也可以做sendError
HttpServletResponse#sendError 如何改變 ContentType
如果您不刷新響應,您的請求將沿過濾器鏈繼續(您必須添加chain.doFilter(request, response);
當然。)。
我不確定,但我認為你可以試試這個:
HttpServletResponse res = (HttpServletResponse) response;
ContentCachingResponseWrapper ccrw= new ContentCachingResponseWrapper(res);
//old body:
String content=new String(ccrw.getContentAsByteArray(), "utf-8");
//try this
HttpServletResponseWrapper hsrw=new HttpServletResponseWrapper(res);
hsrw.getOutputStream().write(/*new body*/);
//OR this
ServletResponseWrapper responseWrapper = (ServletResponseWrapper)response;
responseWrapper.getResponse().resetBuffer();
responseWrapper.getResponse().getOutputStream().write(/*new body*/);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.