簡體   English   中英

我們如何在 Spring 引導過濾器中獲取和設置響應主體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM