補助フィルタ


基礎科目の金英漢のhttps://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard課を見ました
フィルタ
  • フィルタはサーブレットによって提供される機能である.
  • が共通に関心を持つ問題を解決するためには、HTTPのヘッダまたはURL情報が必要であり、フラットパネルフィルタまたはスプリングインタフェースは、HttpServeretRequestを提供する.
  • 補助フィルタ
  • 水門フィルターは、ゲート長の役割を担う機能です.
  • フィルタフロー
    HTTPリクエスト>WAS>フィルタ>サーバ(派遣サーバ)>コントローラ
    フィルタ制限
    HTTPリクエスト>WAS>フィルタ>サーブレット>コントローラ//ログインユーザー
    HTTPリクエスト>WAS>フィルタ(サーブレット呼び出しXと呼ばれる不適切なリクエストとみなされる)/非ログインユーザ.
    フィルタチェーン
    HTTPリクエスト>WAS>フィルタ1>フィルタ2>フィルタ3>テンプレート>コントローラ
  • フィルタはチェーンからなり、その間にフィルタを自由に追加することができる.たとえば、ログ保存では、フィルタを最初に適用し、ログインするかどうかを確認するフィルタを作成できます.
  • フィルタインタフェース
    
    public interface Filter {
    
        public default void init(FilterConfig filterConfig) throws ServletException {}
        
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException;
                
        public default void destroy() {}
        
    }
    
    
  • サーボコンテナ単調オブジェクトとしてフィルタを作成および管理します.
  • init():サーバコンテナの作成時に呼び出されるフィルタ初期化方法.
  • doFilter():このメソッドは、お客様が要求するたびに呼び出されます.フィルタの論理を実現すればいい.
  • destory():フィルタ終了メソッドは、サーバコンテナが閉じたときに呼び出されます.
  • サービス・フィルタ-要求ログ
    @Slf4j
    public class LogFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            log.info("log filter init");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            log.info("log filter doFilter");
    
            // 기능이 많지 않기때문에 다운캐스팅
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            String requestURI = httpRequest.getRequestURI();
    
            String uuid = UUID.randomUUID().toString();
            try{
                log.info("REQUEST [{}{}]", uuid, requestURI);
                // 다음필터를 호출한다.
                chain.doFilter(request,response);
            }catch (Exception e){
                throw  e;
            }finally {
                log.info("RESPONSE [{}{}]", uuid, requestURI);
            }
        }
    
        @Override
        public void destroy() {
            log.info("log filter destroy");
        }
    }
    テンプレートフィルタスプリングに追加
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        public FilterRegistrationBean logFilter() {
            FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
            filterFilterRegistrationBean.setFilter(new LogFilter()); // 만든 필터 넣어주고
            filterFilterRegistrationBean.setOrder(1); // 필터 우선순위 정해주고
            filterFilterRegistrationBean.addUrlPatterns("/*"); // 모든 경로에 다 적용한다.
    
            return filterFilterRegistrationBean;
        }
    }
    logback mdcも検索してみましょう
    ログインチェックフィルタの作成
    
    @Slf4j
    public class LoginFilter implements Filter {
    
        // 들어올수 있는 경로
        private static final String[] whiteList = {"/", "/members/add", "/login", "/logout", "/css/*"};
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            Filter.super.init(filterConfig);
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            String requestURI = httpServletRequest.getRequestURI();
    
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    
            try{
                log.info("인증체크 필터 시작 {}",requestURI);
    
                if(isLoginCheckPath(requestURI)) {
                    log.info("인증 체크 로직 실행 {}", requestURI);
    
                    HttpSession session = httpServletRequest.getSession(false);
                    if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER)==null) {
                        log.info("미인증 사용자가 요청했다 !{}", requestURI);
                        // 로그인으로 리다이렉트
                        httpServletResponse.sendRedirect("/login?redirectURL=" + requestURI);
                        return ;
                    }
                }
    
                chain.doFilter(request,response);
            }catch (Exception e) {
                throw  e;
            } finally {
                log.info("인증체크 필터 종료 {}", requestURI);
            }
    
        }
    
        /**
         * 화이트 리스트의 경우 인증체크 X
         */
        private boolean isLoginCheckPath(String requestURI) {
            return !PatternMatchUtils.simpleMatch(whiteList, requestURI);
        }
    
        @Override
        public void destroy() {
            Filter.super.destroy();
        }
    
    }
    
    redirectセクションでは、コントローラから@requestParam(defaultValue="/")StringリダイレクトURLパラメータを受信して処理する必要があります.