SpringBoot 필터,차단기,모니터 비교 및 사용 장면 분석
                                            
 14900 단어  SpringBoot필터차단기모니터
                    
 
 구별
1.필터
필터 의 영문 이름 은 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(" ");
    }
}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());
        }
    }
}
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;
    }
}
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);
    }
}
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/");
//    }
}1.정적 자원 문제
SpringBoot 2.x 이후 버 전 차단기 도 정적 자원 을 차단 합 니 다.차단 기 를 설정 할 때 자세 자원 을 놓 아야 합 니 다.
 /*
     *       Spring  ,       ,           
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new PageInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/page/login", "/user/login","/page/ajax","/static/**");
    }
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 에 대한 수정 을 실 현 했 습 니 다.
스프링 부 트 필터,차단기,감청 기 대비 및 사용 장면 분석 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.스프링 부 트 필터,차단기,감청 기 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.