簡體   English   中英

spring boot - 從過濾器返回 pojo 響應

[英]spring boot - returning pojo response from filter

我想創建一個具有自動裝配構造函數參數的過濾器/bean,並且對於對某些 url 的每個請求檢查標頭並返回一個 pojo 錯誤(或理想情況下拋出將由 spring 處理的異常),或通過過濾器鏈傳遞請求. 就像是

@Bean
class MyFilter {

  @Autowired
  public MyFilter(MyService myService) {...}

  public doFilter(request, response, chain) {
     if (request. ...) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST)
        // or return new MyErrorPojo()
     }
     return chain.doFilter(request, response)
  }
}

春天的做法是什么?

也許這會幫助你。

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
@Order( 1 )
public class RequestFilter implements Filter
{

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

    {

        HttpServletRequest req = ( HttpServletRequest ) request;
        if( false )
        {
            response.getWriter().println( "error" );
            throw new ServletException( "" );
        }
        else
        {
            doFilter( request, response, chain );
        }

    }
}

我認為在這里你有一個相當令人困惑的技術組合:

過濾器屬於 servlet 規范,並在 HTTP 請求抽象級別上運行。

一旦過濾器鏈通過並到達 DispatcherServlet(spring mvc 的入口點),spring 就會與所有 MVC 好東西一起發揮作用。

因此,如果您想檢查標題,則有一個名為org.springframework.web.servlet.handler.HandlerInterceptorAdapter的抽象

基本上可以創建一個實現這個接口的類,並檢查方法中的頭:屬於這個接口

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

如您所見,您可以訪問請求並可以檢查那里的標頭。

現在我自己沒有使用過(現在無法檢查)但它需要在 WebMvcConfigurer 級別進行配置,該配置具有特殊的“addInterceptor”方法。 所以我不能確認只添加一個創建類型的 bean 就足夠了,或者你可以用 WebMvcConfigurer 配置它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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