• springMVC拦截器和过滤器


    拦截器

    是指通过统一拦截浏览器向服务器发送的请求并进行增强的东西。主要应用例如:编码,权限验证。

    过滤器

    依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。类似公路上的收费站。

    共同点

    抛开细节,过滤器和拦截器的功能非常相似。

    实现一个拦截器,

    1.实现HandlerInterceptor接口,实现三个方法。

    2.注册拦截器,springboot是编写一个配置类继承WebMvcConfigurerAdapter重写addInterceptors方法注册

    3.如果需要配置拦截规则,可以自行配置,参考官网文档把。

     1 package com.example.demo;
     2 
     3 import org.springframework.web.servlet.HandlerInterceptor;
     4 import org.springframework.web.servlet.ModelAndView;
     5 
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 /**
    10  * Created by 20160216 on 2018/2/8.
    11  */
    12 public class SessionInterceptor implements HandlerInterceptor
    13 {
    14     @Override
    15     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
    16         System.out.println("uri="+request.getRequestURI());
    17         //登录不做拦截
    18         if(request.getRequestURI().equals("/userbg/login") || request.getRequestURI().equals("/user/login_view"))
    19         {
    20             return true;
    21         }
    22         //验证session是否存在
    23         Object obj = request.getSession().getAttribute("_session_user");
    24         if(obj == null)
    25         {
    26             response.sendRedirect("/user/login_view");
    27             return false;
    28         }
    29         return true;
    30     }
    31 
    32     @Override
    33     public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    34 
    35     }
    36 
    37     @Override
    38     public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    39 
    40     }
    41 }
    定义拦截器
     1 @Configuration
     2 public class MyMvcConfig extends WebMvcConfigurerAdapter {
     3     /**
     4      * 静态资源配置
     5      */
     6     /*@Override
     7     public void addResourceHandlers(ResourceHandlerRegistry registry) {
     8         registry.addResourceHandler("/img/**")
     9                 .addResourceLocations("classpath:/imgs/");
    10         
    11         super.addResourceHandlers(registry);
    12     }*/
    13     
    14     /**
    15      * 默认首页配置
    16      */
    17     @Override
    18     public void addViewControllers(ViewControllerRegistry registry) {
    19         registry.addViewController("/").setViewName("forward:/index");
    20         registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    21         super.addViewControllers(registry);
    22     } 
    23     
    24     /**
    25      * interceptor配置
    26      */
    27     @Override
    28     public void addInterceptors(InterceptorRegistry registry) {
    29         registry.addInterceptor(new SessionInterceptor())
    30                 //添加需要验证登录用户操作权限的请求
    31                 .addPathPatterns("/**")
    32                 //排除不需要验证登录用户操作权限的请求
    33                 .excludePathPatterns("/css/**")
    34                 .excludePathPatterns("/js/**")
    35                 .excludePathPatterns("/images/**");
    36     }
    37 }
    注册拦截器

    关于刚刚实现的方法

    1.preHandle在请求之前调用,返回值可以继续或终止请求,参数有res,rep,obj,表示的是当前请求的目标对象,就是controller实例。

    2.postHandle是请求后调用,可以改变视图或者修改发往视图的方法,参数req,res,obj,mv。

    3.afterCompletion请求结束调用。

    执行多个拦截器

    先执行拦截器1的pre >>> 拦截器2的pre >>> 拦截器2的post >>> 拦截器1的post >>> 拦截器2的afterCompletion >>> 拦截器1的afterCompletion

    拦截器其他实现方式

    1可以实现WebRequestInterceptor方法,但是功能没有上面的强大,一般不用.

    拦截器和过滤器的区别

    Filte依赖Servlet容器,基于回调函数,过滤范围大。

    Interceptor依赖框架容器,基于反射机制,至过滤请求。

    这张图是加了过滤器和拦截器的springmvc执行顺序

    zhumiao
  • 相关阅读:
    EasyUI——常见用法总结
    递归算法(转)
    1215整理
    jQuery Ajax 实例 全解析(转)
    EL表达式 (详解)
    JSTL 核心标签库 使用(转)
    JSTL标签用法 详解(转)
    JDBC连接Oracle数据库时出现的ORA-12505错误及解决办法
    java中的基本jdbc中mvc基本示例
    Hibernate的QBC检索方式
  • 原文地址:https://www.cnblogs.com/zhumiao/p/9485876.html
Copyright © 2020-2023  润新知