我已经从几天开始进行了春季启动,现在我想为所有传入请求提供安全拦截器。在研究教程时,我发现有一个带有@Component
注释的类,它实现了HandlerInterceptor
@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(
HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
@Override
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception exception) throws Exception {}
}
,然后必须像
一样使用InterceptorRegistry
向WebMvcConfigurerAdapter
注册此拦截器
@Component
public class ProductServiceInterceptorAppConfig extends WebMvcConfigurerAdapter {
@Autowired
ProductServiceInterceptor productServiceInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(productServiceInterceptor);
}
}
但是在本教程中,我很困惑,拦截器仅用于一种服务,即Products
,我的问题是如何拥有single interceptor class which will intercept all the incoming requests irrespective of any controller path
答案 0 :(得分:0)
如果要保护应用程序安全,则可能需要研究Spring Security项目。
要实现您要执行的操作,您将需要使用Filter和FilterRegistrationBean。
过滤器将拦截您在注册Bean中定义的路径中的每个请求和响应。
从Filter Javadoc:
由于客户端请求链末端的资源,因此每次通过链传递请求/响应对时,容器都会调用Filter的doFilter方法。传入此方法的FilterChain允许Filter将请求和响应传递给链中的下一个实体。 此方法的典型实现将遵循以下模式:
- 检查请求
- (可选)使用自定义实现包装请求对象,以过滤内容或标头以进行输入过滤
- (可选)使用自定义实现包装响应对象,以过滤内容或标题以进行输出过滤
- a)使用FilterChain对象(chain.doFilter())调用链中的下一个实体,
- b)或不将请求/响应对传递给过滤器链中的下一个实体,以阻止请求处理
- 在调用过滤器链中的下一个实体后,直接在响应上设置标头。
下面的示例过滤了来自根(“ / *”)路径的所有请求。
package com.example.demo;
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
private static final Logger log = LoggerFactory.getLogger(FilterConfig.class);
@Bean
public FilterRegistrationBean<Filter> registrationBean(Filter sampleFilter) {
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(sampleFilter);
bean.addUrlPatterns("/*");
return bean;
}
@Bean
public Filter sampleFilter() {
return (request, response, filterChain) -> {
HttpServletRequest servletRequest = (HttpServletRequest) request;
log.info(
"Request URI : {}",
servletRequest.getRequestURI());
filterChain.doFilter(request, response);
log.info(
"After filtering the request : {}",
servletRequest.getRequestURI());
};
}
}