zoukankan      html  css  js  c++  java
  • SpringMVC拦截器

    什么是拦截器

    Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等SpringMVC中通过实现HandlerInterceptor接口实现自定义拦截器类。

    拦截器可以做什么

    拦截器可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等

     

    MVC拦截器流程图

    自定义拦截器

    public class MyIntercept implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("=============拦截器当中的额放行方法==========");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("======在HandlerAdapter之后执行========");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("========呈现之后调用==========");
        }
    }

    接口中实现的三个方法

      preHandle() 方法:该方法会在控制器方法前执行,其返回值表示是否中 断后续操作。当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控 制器类中的方法执行等)。

      postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执 行。可以通过此方法对请求域中的模型和视图做出进一步的修改。

      afterCompletion()方法:该方法会在整个请求完成,即视图渲染结束之 后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。

    拦截器配置

    <!--配置拦截器-->
    <mvc:interceptors>
        <!--如果在此处又多套拦截器,则按照配置顺寻执行-->
        <mvc:interceptor>
            <mvc:mapping path="/my/**"/>
            <bean class="com.my.intercept.MyIntercept"/>
        </mvc:interceptor>
    </mvc:interceptors>

    上面的代码中,<mvc:interceptors>元素用于配置一组拦截器,基子元素<bean>中定义的是全局拦截器,它会拦截所有的请求;而<mvc:interceptor>元素中定义的是指定路径的拦截器,它会对指定路径下的请求生效。<mvc:interceptor>元素的子元素<mvc:mapping>用于配置拦截器作用的路径,该路径在其属性path 中定义。如上述代码中 path 的属性值“/**” 表示拦截所有路径,“/hello” 表示拦截所有以 “/hello” 结尾的路径。如果在请求路径中包含不需要拦截的内容,还可以通过<mvc:exclude-mapping>元素进行配置。
    注意:<mvc:interceptor>中的子元素必须按照上述代码中的配置顺序进行编写,即<mvc:mapping> <mvc:exclude-mapping> <bean>,否则文件会报错。

    拦截器和过滤器的区别

    1、过滤器

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

    2、拦截器

    依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理

     

  • 相关阅读:
    mysql常用时间列表的查询——七天内、本月、本周、某天
    js取数组获取最大值的四种方式
    Mysql按周,按月,按日,按小时分组统计数据
    Mysql中的sum函数为null时的解决办法
    Maven 中 dependencyManagement 标签使用
    嵌入式printf函数运用基于ti 16位MCU
    md5实现对用户名与密码的保护
    c# md5 算法实现
    define a struct
    file.open异常处理
  • 原文地址:https://www.cnblogs.com/mayuan01/p/11843581.html
Copyright © 2011-2022 走看看