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(" ");
}
}
1.2 OncePerRequestFilter
Once 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.차단기
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.모니터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 에 대한 수정 을 실 현 했 습 니 다.
스프링 부 트 필터,차단기,감청 기 대비 및 사용 장면 분석 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.스프링 부 트 필터,차단기,감청 기 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.