SpringBoot 필터,차단기,모니터 비교 및 사용 장면 분석

1.관계 도 이해
在这里插入图片描述
구별
1.필터
  • 필 터 는 웹 애플 리 케 이 션 이 시 작 될 때 초기 화 되 고 웹 애플 리 케 이 션 이 중 단 될 때 소각 합 니 다
  • 요청 한 URL 을 필터 링 할 수 있 고,민감 한 단어 에 필터 링
  • 차단기 의 바깥쪽 을 막는다
  • javax.servlet.Filter 인 터 페 이 스 를 실 현 했 고 Servlet 규범 의 일부분
  • 용기 에 들 어 갈 것 을 요청 한 후 servlet 에 들 어가 기 전에 예비 처 리 를 하고 요청 이 끝 난 것 은 servlet 처리 가 끝 난 후에
  • 웹 용기 의존
  • 여러 번 실 행 됩 니 다
  • 필터 프로필
    필터 의 영문 이름 은 Filter 로 Servlet 기술 에서 가장 실 용적 인 기술 입 니 다.이름 처럼 필 터 는 클 라 이언 트 와 서버 자원 파일 사이 에 있 는 필터 망 으로 요구 에 부합 되 지 않 는 요청 을 걸 러 내 는 데 도움 을 줍 니 다.보통 Session 검사 로 사용자 권한 을 판단 합 니 다.설정 조건 에 부합 되 지 않 으 면 특수 한 주소 나 특수 한 응답 을 기반 으로 차단 합 니 다.
    필터 사용
    먼저 Filter 인 터 페 이 스 를 실현 하고 다시 쓰 는 세 가지 방법 이 필요 합 니 다.
    •init 방법:현재 필 터 를 용기 에 만 들 때 자동 으로 호출 합 니 다.
    •destory 방법:현재 필 터 를 용기 에서 없 앨 때 자동 으로 호출 합 니 다.
    •doFilter 방법:필터 의 구체 적 인 조작
    1.1 HttpServletRequestWrapper요청 이 도착 하기 전에 request 를 수정 합 니 다.
    
    package com.dingwen.lir.filter;
    
    import lombok.extern.slf4j.Slf4j;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.util.Arrays;
    
    /**
     *           request     
     *
     * @author dingwen
     * 2021.04.30 14:54
     */
    @Slf4j
    public class RequestWrapper extends HttpServletRequestWrapper {
        public RequestWrapper(HttpServletRequest request) {
            super(request);
            log.info("RequestWrapper");
        }
    
        @Override
        public String getParameter(String name) {
            //            
            return super.getParameter(name);
        }
    
        @Override
        public String[] getParameterValues(String name) {
            //           
    //        String[] values =super.getRequest().getParameterValues(name);
    //        return super.getParameterValues(name);
            return "t e s t".split(" ");
        }
    
    
    }
    1.2 OncePerRequestFilterOnce PerRequestFilter 는 말 그대로 한 번 의 요청 에서 한 번 만 filter 를 통과 할 수 있 도록 합 니 다.
    
    package com.dingwen.lir.filter;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Arrays;
    
    /**
     *      
     * OncePerRequestFilter:
     * OncePerRequestFilter,    ,                filter.
     *         ,        filter  ,            ,                   ,         ,           web container,
     *           container            ,servlet    ,       ,
     *   ,               ,  filter  OncePerRequestFilter          。
     *
     * @author dingwen
     * 2021.04.30 15:59
     */
    @Slf4j
    public class RequestFilter extends OncePerRequestFilter {
    
    
        @Override
        public void destroy() {
            super.destroy();
            log.info("RequestFilter destroy");
        }
    
        /*
                OncePerRequestFilter.doFilter     request.getAttribute            
                     ,   doFilterInternal  ,       
            */
        @Override
        protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
            try {
                RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);
                filterChain.doFilter(requestWrapper, httpServletResponse);
                log.info("RequestFilter");
                log.info(Arrays.toString(requestWrapper.getParameterValues("name")));
            } catch (Exception exception) {
                httpServletResponse.setCharacterEncoding("utf-8");
                httpServletResponse.setContentType("application/json; charset=utf-8");
                PrintWriter writer = httpServletResponse.getWriter();
                writer.write(exception.toString());
            }
        }
    }
    1.3 설정
    
    package com.dingwen.lir.configuration;
    
    import com.dingwen.lir.filter.RequestFilter;
    import com.dingwen.lir.filter.RequestWrapper;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.servlet.Filter;
    
    /**
     *       
     *
     * @author dingwen
     * 2021.04.30 16:10
     */
    @Configuration
    public class FilterConfig {
    
        @Bean
        public RequestFilter requestFilter(){
            return new RequestFilter();
        }
        @Bean
        public FilterRegistrationBean<RequestFilter> registrationBean() {
            FilterRegistrationBean<RequestFilter> registrationBean = new FilterRegistrationBean<>();
            registrationBean.setFilter(requestFilter());
            registrationBean.addUrlPatterns("/filter/*");
            registrationBean.setName("RequestFilter");
            //      ,           
            registrationBean.setOrder(1);
            return registrationBean;
        }
    }
    2.차단기
  • org.springframework.web.servlet.HandlerInterceptor 인터페이스,동적 에이전트
  • 실현
  • 차단기 응용 장면,성능 분석,권한 검사,로그 기록
  • 스프링 구성 요소 이 며 스프링 용기 에서 관리 되 지 않 습 니 다
  • 톰 캣 등 용기 에 의존 해 단독으로 사용 할 수 있다.웹 프로그램 뿐만 아니 라 애플 리 케 이 션,스윙 등에 도 사용 할 수 있 습 니 다
  • .
  • servlet 에 들 어 오 라 고 요청 한 후 Controller 에 들 어가 기 전에 미리 처 리 했 습 니 다.Controller 에서 해당 하 는 보 기 를 렌 더 링 한 후 요청 이 끝 났 습 니 다
  • 2.1 접속 차단
    
    package com.dingwen.lir.interceptor;
    
    import com.dingwen.lir.entity.User;
    import org.springframework.stereotype.Component;
    import org.springframework.util.ObjectUtils;
    import org.springframework.web.servlet.HandlerInterceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     *     
     *
     * @author dingwen
     * 2021.04.25 13:50
     */
    @Component
    public class PageInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            User user = (User)request.getSession().getAttribute("user");
            if (!ObjectUtils.isEmpty(user)) {
                return true;
            } else {
                //           ,    false。             
                redirect(request, response);
                return false;
            }
        }
    
        /*
         *      ajax            
         * @param request
         * @param response
         *
         */
        public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
            if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){// ajax
                //         
                response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTENT_PATH");
                //  ajax     
                response.setHeader("REDIRECT", "REDIRECT");
                //  ajax       
                StringBuffer url = request.getRequestURL();
                String contextPath = request.getContextPath();
                response.setHeader("CONTENT_PATH", url.replace(url.indexOf(contextPath) + contextPath.length(), url.length(), "/").toString());
            }else{// http
                response.sendRedirect( "/page/login");
            }
    
            response.getWriter().write(403);
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        }
    }
    2.2 설정
    
    package com.dingwen.lir.configuration;
    
    import com.dingwen.lir.interceptor.PageInterceptor;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * mvc      
     * MyWebMvcConfigurer: Springboot2.x      
     *
     * @author dingwen
     * 2021.04.26 17:52
     */
    @Configuration
    public class MyWebMvcConfigurer implements WebMvcConfigurer {
    
        /*
         *       Spring  ,       ,           
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //           ,        ,     Order      ,       。
    //        registry.addInterceptor(new PageInterceptor()).addPathPatterns("/**").order()
            registry.addInterceptor(new PageInterceptor()).addPathPatterns("/**")
                    .excludePathPatterns("/page/login", "/user/login","/page/ajax","/static/**");
        }
    
    
        /*
         *                  
         * @param registry
         */
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/page/ajax").setViewName("ajax");
        }
    
    
        /*
         *          
            Spring Boot               :
                    classpath:/META-INF/resources
                    classpath:/resources
                    classpath:/static
                    classpath:/public
                     :META-INF/resources > resources > static > public
         * @param registry
         *
         */
    //    @Override
    //    public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
            registry.addResourceHandler("/static/**").addResourceLocations("file:E:/static/");
    //    }
    }
    3.모니터
  • javax.servlet.servletRequestListener,javax.servlet.http.HttpSessionListener,javax.servlet.ServletContextListener 등 인터페이스 구현
  • 주로 감청 대상 의 생 성과 소각 의 발생 에 사 용 됩 니 다.예 를 들 어 session 의 생 성 소각,request 의 생 성 소각,ServletContext 생 성 소각
  • 셋째,주의
    1.정적 자원 문제
    SpringBoot 2.x 이후 버 전 차단기 도 정적 자원 을 차단 합 니 다.차단 기 를 설정 할 때 자세 자원 을 놓 아야 합 니 다.
    
     /*
         *       Spring  ,       ,           
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new PageInterceptor()).addPathPatterns("/**")
                    .excludePathPatterns("/page/login", "/user/login","/page/ajax","/static/**");
        }
    SpringBoot2.x 사용자 정의 정적 자원 맵
    
    spring:
      mvc:
        static-path-pattern: /static/**
    기본 디 렉 터 리
    classpath:/META-INF/resources
    classpath:/resources
    classpath:/static
    classpath:/public
    우선 순위:META-INF/resources>resources>static>public
    2.로그 인 차단 ajax 재 설정
    ajax 는 비동기 이기 때문에 현재 페이지 에서 진행 되 는 부분 요청 입 니 다.로그 인 요청 을 차단 할 때 방향 을 바 꿔 도 적용 되 지 않 습 니 다.서버 에서 주 소 를 전단 으로 이동 시 켜 야 합 니 다.로그 인 차단기 코드 를 자세히 보십시오.
    
    //     
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>AJAX</title>
        <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
    </head>
    <body>
        <button>USER</button>
    </body>
    </html>
    
    <script>
        $.ajaxSetup({
            complete:function(xhr,status){
                //              
                let win = window;
                //   xhr     
                let REDIRECT = xhr.getResponseHeader("REDIRECT");
                //         REDIRECT                   
                if (REDIRECT === "REDIRECT")
                {
                    while (win !== win.top)
                    {
                        win = win.top;
                    }
                    win.location.href = xhr.getResponseHeader("CONTEXTPATH");
                }
            }
        });
        $("button").click(function(){
            $.get("/page/user", function(result){
                $("div").html(result);
            });
        });
    </script>
    테스트
    코드 주소:https://gitee.com/dingwen-gitee/filter-interceptor-study.git
    1.차단기 테스트
    1.1 시작 항목 첫 페이지 방문
    http://localhost:8080/page/index
    로그 인 하지 않 았 기 때문에 로그 인 페이지 로 바로 바 꾸 었 습 니 다.
    在这里插入图片描述
    1.2 사용자 이름 비밀 번 호 를 입력 하여 로그 인 을 완료 하고 사용자 페이지 로 이동
    在这里插入图片描述
    在这里插入图片描述
    이 때 첫 페이지 에 접근
    在这里插入图片描述
    1.2 로그 인 종료
    성공 적 으로 종료 하면 권한 을 수 여 받 은 페이지 에 접근 하 는 것 도 상대 적 으로 로그 인 페이지 로 재 설정 됩 니 다.
    在这里插入图片描述
    1.3 ajax 권한 이 부여 되 지 않 은 접근 테스트
    在这里插入图片描述
    user 에 접근 하려 면 누 르 십시오.로그 인하 지 않 았 기 때문에 전권 접근 이 없습니다.프론트 에서 페이지 를 돌 리 며 로그 인 페이지 로 넘 어 갔다.
    在这里插入图片描述
    2.필터 테스트
    在这里插入图片描述
    在这里插入图片描述
    필터 가 대응 하 는 처 리 를 한 것 을 볼 수 있 습 니 다.재 작성 한 getParameterValues()도 유효 합 니 다.HttpServletRequestWrapper&OncePerRequestFilter 를 사용 하여 request 에 대한 수정 을 실 현 했 습 니 다.
    스프링 부 트 필터,차단기,감청 기 대비 및 사용 장면 분석 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.스프링 부 트 필터,차단기,감청 기 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기