Springboot 2(7)カスタムFilter(フィルタ)を簡単に作成

15169 ワード

フィルタ
フィルタFilterは、Servletの実用的な技術です.フィルタを使用して、セッションを読み込み、ユーザーがログインしているかどうかを判断したり、アクセスしている**リクエストURLにアクセス権限(白黒リスト)**があるかどうかを判断したりするなど、リクエストをブロックできます.主にリクエストを前処理することもできます.次に、springbootでフィルタ機能を実現する方法について説明します.
sprinbootには2つの実装方法があります
1. @WebFilte @WebFilte rによる注記構成
//      customFilter,   url   
@WebFilter(filterName="customFilter",urlPatterns={"/*"},
        initParams = {
                @WebInitParam(name = "excludeUrl", value = "/exclude")
        })
@Slf4j
@Order(5)
public class CustomFilter implements Filter {
    private String exclusions = null;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        exclusions = filterConfig.getInitParameter("excludeUrl");
        //        ,     
        log.info("filter    ,excludeUrl:"+exclusions);
    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        log.info(request.getRequestURI());
        if (request.getRequestURI().equals(exclusions)) {
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        log.info("CustomFilter     ");
        log.info("    :"+request.getRequestURL());
        // request、response       
        //         
        // servletRequest.setCharacterEncoding("UTF-8");
        // servletResponse.setCharacterEncoding("UTF-8");
        //             
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        log.info("filter   ");
    }
}

フィルタURLの実装を無視
CustomFilterクラスに@Component@Configurationを追加してfilterに注入することができますが、この方法ではinitParamsに設定された値が得られません.
正しい方法起動クラスに@ServletComponentScanを追加
@WebFilter共通プロパティ
ツールバーの
を選択します.
必要かどうか
説明
asyncSupported
boolean
いいえ
Filterが非同期モードをサポートするかどうかを指定します
dispatcherTypes
DispatcherType[]
いいえ
Filterがどの方式のリクエストをフィルタするかを指定します.サポートする属性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST;すべてのメソッドをデフォルトでフィルタするリクエスト
filterName
String
いいえ
Filter名
initParams
WebInitParam[]
いいえ
構成パラメータ
displayName
String
いいえ
Filter表示名
servletNames
String[]
いいえ
どのサーブレットをフィルタするかを指定します
urlPatterns/value
String[]
いいえ
2つのアトリビュートは同じ役割を果たし、ブロックするパスを指定します.
2.FilterRegistrationBean方式
2つのステップ:
  • はFilterインタフェースを実現し、Filte
  • を実現する.
    @Slf4j
    public class MyFilter implements Filter {
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            log.info("   MyFilter");
        }
    
        @Override
        public void doFilter(ServletRequest srequest, ServletResponse sresponse,
                             FilterChain filterChain)
                throws IOException, ServletException {
            // TODO Auto-generated method stub
            log.info("MyFilter     ");
            HttpServletRequest request = (HttpServletRequest) srequest;
            filterChain.doFilter(srequest, sresponse);
        }
    
    }
    
    
  • @Configuration注記を追加し、カスタムFilterをフィルタチェーン
  • に追加
    @Configuration
    public class WebConfiguration {
        @Bean
        public RemoteIpFilter remoteIpFilter() {
            return new RemoteIpFilter();
        }
        
        @Bean
        public FilterRegistrationBean testFilterRegistration() {
    
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(new MyFilter());
            registration.addUrlPatterns("/*");
            registration.addInitParameter("paramName", "paramValue");
            registration.setName("MyFilter");
            registration.setOrder(1);
            return registration;
        }
    }    
    
    

    複数のfilterがある場合は、registration.setOrder(1)または@Order(5)により実行順序が設定され、数値が小さいほど早く実行される.