반응형
spring boot에서 필터를 사용하기 위해서는 2가지 방법을 사용한다.
1) Configuration 을 통해 Bean으로 필터를 등록
package com.devracoon.test;
import com.devracoon.test.filter.OneFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public FilterRegistrationBean<OneFilter> getOneFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new OneFilter());
registrationBean.setOrder(0);
return registrationBean;
}
}
@Slf4j
public class OneFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("One Filter ");
chain.doFilter(request, response);
}
}
등록된 Filter가 잘 작동하는지 테스트 해보자.
샘플로 만든 Rest API를 호출해 보자.
package com.devracoon.test.controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/test/api")
public class TestRestAPI {
@RequestMapping("{name}")
public TestDTO testapi(HttpServletRequest request , HttpServletResponse response,
@PathVariable("name") String name) throws Exception{
response.sendRedirect(request.getContextPath() + "/test/api/forward/" + name);
return TestDTO.builder().id("1").name(name).build();
}
@RequestMapping("/forward/{name}")
public TestDTO forwardTestApi(@PathVariable("name") String name){
return TestDTO.builder().id("1").name(name).build();
}
}
API 를 호출해 보면 정상적으로 Filter가 작동하는것을 확인 할 수 있다.
2) GenericFilterBean를 상속 받아 구현.
1번에서 처럼 FilterRegistrationBean을 상속받아 하게 되면 Spring Bean을 사용할수 없게 되는데 아래처럼 하면
@Autowired를 사용할수 있게 되고 Filter도 자동등록되게 된다.
@Slf4j
@Order(0)
@Component
public class OneFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("One Filter ");
chain.doFilter(request, response);
}
}
여러 Filter를 등록하게 되면 Filter의 순서가 중요해 지는데 이때 Filter의 순서는 @Order Annotation으로 순서를 정할수 있다.
'Spring > Filter' 카테고리의 다른 글
2) Springboot OncePerRequestFilter 와 GenericFilterBean의 차이 (0) | 2021.04.30 |
---|