定义拦截器

springMvc 中定义拦截器只需要实现一个接口 org.springframework.web.servlet.HandlerInterceptor


public class Myfilter implements HandlerInterceptor {
...
}

接口中三个方法


/**
在执行 handler 之前,执行 进,进行拦截;
方法返回 true ,则放行;返回false,则拦截 ; 用途:身份认证,权限管理
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
} /**
在执行handler之后,且在返回 modelAndView 之前执行 用途:为 modelAndView 填充一些统一的数据
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } /**
在执行完 handler 之后(注意是执行完,不是执行),执行 ; 用途: 进行统一的异常处理 ;
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }

配置拦截器

springMvc 的拦截器是针对 HandlerMapping 的,也就是一个 拦截器,对应一个 映射器 ,哪个映射器配置了拦截器,那么只有经过该拦截器映射成功的 handler 才会被拦截 ;;

但是,也可以配置一个 类似 于全局的拦截器,利用 springMvc 将一个拦截器,注入到每一个 映射器 中,就可以完成类似全局拦截器 ;

  1. 配置单个映射器的拦截器

    springMvc.xml 中进行配置 ;


    <!--自定义拦截器-->
    <bean class="xin.ijava.ssm.filter.Myfilter" id="myfilter" /> <!--配置单个拦截器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="interceptors">
    <list>
    <ref bean="myfilter"/>
    </list>
    </property>
    </bean>
  2. 配置类似全局的拦截器

    可以配置多了拦截器,类似于拦截链的样子,拦截顺序按照定义的顺序!

        <!--配置类似全局的拦截器-->
    <mvc:interceptors>
    <!--可以配置多个拦截器。按照配置的顺序进行拦截-->
    <mvc:interceptor>
    <!--配置拦截的url , ** 代表拦截所有,包括子目录-->
    <mvc:mapping path="/**"/>
    <bean class="xin.ijava.ssm.filter.Myfilter"/>
    </mvc:interceptor> <!--再配置一个拦截器-->
    <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <bean class="xin.ijava.ssm.filter.Myfilter1"/>
    </mvc:interceptor>
    </mvc:interceptors>

多个拦截器的规则

这里以 2 个拦截器为例子 ,A,B 两个拦截器,A是第一个,B是第二个;

  1. A、B 都放行

    preHandle 按照拦截器的定义 顺序执行,后两个方法 postHandleafterCompletion ,按照拦截器的定义顺序 逆序执行

  2. A放行,B不放行

    preHandle 方法总是会执行,因为在里面进行判断是否放行 ;

    A拦截器放行,才会执行B拦截器,加强A 没有放行,那么后面的拦截器都不会得到执行;

    只要有一个拦截器不放行,那么所有的拦截器的 postHandle 都不会得到执行 ,但是其他放行的拦截器的 afterCompletion 会得到执行 ;

  3. A,B都不放行

    preHandle 方法总是会执行,因为在里面进行判断是否放行 ;

    由于A 没有放行,那么A后面的拦截器都不会得到执行了 ,就像一个链子一样,在此断掉了(拦截链);

综合所述,对于统一日志的处理,要放在第一位,并其要放行 ;

(十五)springMvc 拦截器的更多相关文章

  1. 五 : springMVC拦截器

    springMVC拦截器的实现一般有两种方式 第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口 第二种方式是继承实现了HandlerInte ...

  2. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  3. 使用Typescript重构axios(十四)——实现拦截器

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  4. SpringMVC拦截器的使用

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  5. SpringMVC拦截器详解[附带源码分析]

    目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...

  6. SpringMVC拦截器2(资源和权限管理)(作为补充说明)

    SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServle ...

  7. SpringMVC拦截器(实现登录验证拦截器)

    本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ ...

  8. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  9. SpringMVC拦截器Interceptor

    SpringMVC拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与servlet中的Filter. SpringMVC 中的Interceptor 拦截请求是通过Ha ...

  10. 基于SpringMVC拦截器和注解实现controller中访问权限控制

    SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...

随机推荐

  1. css偷懒神奇

    偷懒神奇链接:https://qishaoxuan.github.io/css_tricks/glass/

  2. Geos判断点是否在多边形内

    使用的geo版本是3.5.1 #include <iostream> #include "geos.h" using namespace std; GeometryFa ...

  3. vue后台_实战篇

    一.一些常用组件效果的实现 1)面包屑导航 主要是使用$route.mathed:一个数组,包含当前路由的所有嵌套路径片段的路由记录 .路由记录就是 routes 配置数组中的对象副本 (还有在 ch ...

  4. ScvQ常用的网站(持续更新...)

    GitHub:https://github.com/ScvQ 幕课网:https://www.imooc.com/u/4659537/courses 免费的SS:https://global.isha ...

  5. 彻底搞清楚javascript中的require、import和export(js模块加载规范的前世今生)

    为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...

  6. [oracle]oracle表在什么情况下会被锁住(转载)

    DML锁又可以分为,行锁.表锁.死锁 行锁:当事务执行数据库插入.更新.删除操作时,该事务自动获得操作表中操作行的排它锁. 表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它 ...

  7. SQL-W3School-高级:SQL NULL 值

    ylbtech-SQL-W3School-高级:SQL NULL 值 1.返回顶部 1. NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS N ...

  8. Qt编写数据可视化大屏界面电子看板9-曲线效果

    一.前言 为了编写数据可视化大屏界面电子看板系统,为了能够兼容Qt4和嵌入式linux系统,尤其是那种主频很低的,但是老板又需要在这种硬件上(比如树莓派.香橙派.全志H3.imx6)展示这么华丽的界面 ...

  9. 类型TTreeView.items.add 与 TTreeView.items.addchild有何区别?(10分)

    我看了书上例子,好象两者都可以实现treeview中的node 的构建. addchild是给当前的node建一个子node,它比当前node要向右缩进几格add建立同级的node,不缩进 aNode ...

  10. vim复制粘贴导致多行出现#号解决办法

    在vim内复制多行假如复制的行带有#号会导致其他不带#号的行自动加# 解决办法,输入一下命令再粘贴即可 :set paste