截取自:Spring Security OAuth2.0 认证协议【4】
过滤、拦截、切片
非常重要的三个概念,后面用三方类的时候需要有的概念。
-
过滤器(Filter)
JEE的规范,处于最外层,能拿到请求(request)和响应(response),但也只能拿到这两个东西。doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
由于是JEE规范的东西,因此无法操作spring,即 无法知道请求被哪个controller处理
但可以通过FilterRegistrationBean把它注册到spring中,被spring管理
(第三方Filter插件的运行原理,下面演示) -
拦截器(Interceptor)
和Filter相反,拦截器是Spring提供的类,天生就能让spring管理(当然,也需要注册),
相比起 Filter ,Interceptor 除了能拿到 request 和 response,还能拿到 handler (Controller 的处理器)
postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView)
-
切片(Aspect)
上面讲了 拦截器(interceptor)可以获得request 、response 和 handler ,但他无法获取 handler 上的参数
这时候就需要用到 切面(Aspect)了,
下面各自创一个类
# Filter
filter应该都懂,两个重点
- JEE的规范,处于最外层
- SpringBoot 环境不能直接创建,需要通过 FilterRegistrationBean
创建 filter 类
package cn.vshop.security.web.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StopWatch;
import javax.servlet.*;
import java.io.IOException;
/**
* @author alan smith
* @version 1.0
* @date 2020/3/31 18:00
*/
// JEE 标准,默认不收spring管理
// 不要直接使用@Component,Spring无法管理,必须借助FilterRegistrationBean创建
//@Component
@Slf4j
public class TimeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("time filter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("time filter start");
StopWatch watch = new StopWatch();
watch.start("filter");
filterChain.doFilter(servletRequest, servletResponse);
watch.stop();
System.out.println(watch.prettyPrint());
log.info("time filter finish");
}
@Override
public void destroy() {
log.info("time filter destroy");
}
}
创建 webConfig ,执行web相关注册
package cn.vshop.security.web.config;
import cn.vshop.security.web.filter.TimeFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context