赞
踩
一、springboot中过滤器、拦截器和切片(Aspect)的描述及区别
1、描述:
(1)过滤器(Filter):是servlet容器实现的功能,使用时需要引入 Servlet 依赖。其可以对所有请求进行过滤,其在容器启动时进行一次初始化调用init方法,容器关闭时调用销毁方法。主要用于对 请求和响应做一些信息过滤,或者设置及销毁一些参数信息。如修改字符编码、在request加入参数、对请求进行拦截、通过request的session判断用户登录状态等。
(2)拦截器(Interceptor):是spring框架实现的功能,在实现上是基于Java的反射机制,一个拦截器实例在一个controller生命周期之内可以多次调用。只能对controller定义的方法进行拦截,但是对静态资源的请求则没办法进行拦截处理。
(3)切片(Aspect):即spring的AOP功能,面向切面编程,使用时需要引入 aop 依赖。定义切入点(在哪些方法起作用、什么时候起作用)以及在切入点执行的方法。
2、区别:
二、使用
1、过滤器
- //过滤器名称为loginFilter,拦截/desktop,/hello的请求
- //使用@Order是没办法控制多个过滤器顺序的,只能使用 FilterRegistrationBean
- @WebFilter(filterName="loginFilter",urlPatterns={"/desktop","/hello/*"})
- //@Component
- public class LoginFilter implements Filter
- {
-
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- System.out.println("filter初始化");
- }
-
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- System.out.println("=====进去filter");
- //设置request请求编码等
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
- chain.doFilter(request, response); //传给下一个过滤器
- }
-
- @Override
- public void destroy() {
- // TODO Auto-generated method stub
- }
- }
当有多个过滤器,且需要控制其执行顺序时,过滤器注释掉 @WebFilter,改为@Component
然后在启动类(获取其他@Configuration注解的bean)写如下代码
- @Autowired
- private LoginFilter loginFilter;
-
- @Bean
- public FilterRegistrationBean filterRegistrationBean(){
- FilterRegistrationBean registrationBean = new FilterRegistrationBean();
- registrationBean.setFilter(loginFilter);
- registrationBean.setName("loginFilter");
- registrationBean.addUrlPatterns("/face/*");
- registrationBean.setOrder(3); //order越小越先执行
- return registrationBean;
- }
2、拦截器
定义拦截器实现类,实现 HandlerInterceptor
- @Component
- public class LoginInterceptor implements HandlerInterceptor
- {
- @Override
- public boolean preHandle(HttpServletRequest request ,
- HttpServletResponse response, Object handler)throws Exception{
- System.out.println("========拦截");
- //获取类名
- ((HandlerMethod)handler).getBean().getClass().getName();
- //获取方法名
- ((HandlerMethod)handler).getMethod().getName();
- System.out.println(request.getContentType());
- return true; //返回false则controller的方法不会执行
- }
-
- @Override
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler, ModelAndView model)throws Exception{
- //处理请求完成后视图渲染之前的处理操作,controller异常则不执行
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception e)throws Exception{
- //视图渲染之后的处理操作,controller异常仍执行
- }
- }
需要在实现WebMvcConfigurer类中加入该拦截器,拦截器才能生效
- @Configuration
- public class Webconfigurer implements WebMvcConfigurer
- {
- @Autowired
- private LoginInterceptor loginInterceptor;
-
- //拦截除 /login /register 外的所有请求
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login","/register");
-
- }
- }
3、Aspect
定义切片实现类,添加@Aspect注解
- @Aspect
- @Component
- public class MyAspect {
- @Around("execution(* com.example.security.controller.HelloController.*(..))")
- public Object handleAspect(ProceedingJoinPoint pjp) throws Throwable {
- Object[] args = pjp.getArgs();
- //打印方法中的所有参数
- Arrays.stream(args).forEach(System.out::println);
- //调用对应切入点的方法
- Object o = pjp.proceed();
- return null;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。