SpringBoot 过滤器 拦截器 配置 过滤器与拦截器的区别与执行顺序

1.过滤器配置

自定义过滤器步骤:
1.在启动类上添加@ServletComponentScan注解进行servlet组件扫描
2.编写自定义过滤器类并实现Filter接口
3.使用@WebFilter(urlPatterns = “/user/*”)注解,注解过滤器类并表明过滤那些路径,urlPatterns 属性就是设置拦截路径范围的
拦截器代码如下:

@WebFilter(urlPatterns = "/user/*")//过滤路径user路径下的所有请求
public class Myfilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器操作");
        //不能直接使用需要转换成HttpServletRequest HttpServletResponse对象
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String name = request.getParameter("name");
        if ("zhangsan".equals(name)){
            //如果是zhansan放行
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            //拦截跳转到登入页面
            response.sendRedirect("/login.html");
        }
    }

    @Override
    public void destroy() {
        System.out.println("过滤器资源释放销毁");
    }
}

Controller测试代码

@RestController
public class UserController {

    Map<String,Object> map =  new HashMap<>();
    
    /**
     * 测试过滤器
    * @param name
     * @return
     */
    @GetMapping("/user/login")
    public Object login(String name){
        map.clear();
        map.put("name",name);
        return map;
    }
}

测试1 name值为zhangsan放行
在这里插入图片描述
测试2 name值不为zhangsan跳转到login页面
在这里插入图片描述

2.拦截器配置

拦截器配置步骤:
步骤一:自定义拦截器
1.新建一个类使用@Component注解放到spring容器中
2.实现HandlerInterceptor接口
3.实现preHandle postHandle afterCompletion 方法具体看步骤1代码
步骤二:注册引用拦截器
1.自定义一个类 实现WebMvcConfigurer接口并 使用@Configuration注解
2.实现WebMvcConfigurer接口中的addInterceptors方法
3.在addInterceptors方法中注册自定义拦截器并进行相关配置 具体看步骤2代码
步骤一代码

@Component
public class LoginInterceptor implements HandlerInterceptor {

    //在controller之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器preHandle 在controller之前执行");
        String name = request.getParameter("name");
        if ("zhangsan01".equals(name)){
            System.out.println("拦截器拦截了"+name);
            response.sendRedirect("/login.html");
            return false;//若是zhangsan拦截
        }
        return true;//返回true放行 返回falser 拦截
    }
    //在controller执行之后,跳转页面之前执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器postHandle 在controller执行之后,跳转页面之前执行");
    }
    //所有操作完毕之后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器afterCompletion 所有操作完毕之后执行");
    }
}

步骤二代码

@Configuration
public class MyMvcConfigure implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    //在此方法添加自定义拦截器
    public void addInterceptors(InterceptorRegistry registry) {

               //添加自定义拦截器                //拦截器拦截那些路径
    registry.addInterceptor(loginInterceptor).addPathPatterns("/user/*");
        //不拦截的路径
    // .excludePathPatterns("");
    }
}

3.拦截器与过滤器的执行顺序

过滤前->拦截前->action执行->拦截后->过滤后

4.拦截器与过滤器的区别

过滤器和拦截器非常相似,但是它们有很大的区别
最简单明了的区别就是过滤器可以修改request,而拦截器不能
过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
拦截器可以调用IOC容器中的各种依赖,而过滤器不能
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法
区别很多,大家可以去查下
总的来说
过滤器就是筛选出你要的东西,比如requeset中你要的那部分
拦截器在做安全方面用的比较多,比如终止一些流程

发布了59 篇原创文章 · 获赞 70 · 访问量 3039

猜你喜欢

转载自blog.csdn.net/qq_44784185/article/details/104988179