拦截器

3.1 定义

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

3.2 拦截器定义

实现HandlerInterceptor接口,如下:

Public class HandlerInterceptor1 implements HandlerInterceptor{/*** controller执行前调用此方法* 返回true表示继续执行,返回false中止执行* 这里可以加入登录校验、权限拦截等*/@OverridePublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {// TODO Auto-generated method stubReturn false;}/*** controller执行后但未返回视图前调用此方法* 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示*/@OverridePublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// TODO Auto-generated method stub}/*** controller执行后且视图返回后调用此方法* 这里可得到执行controller时的异常信息* 这里可记录操作日志,资源清理等*/@OverridePublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {// TODO Auto-generated method stub}}

 

 

3.3 拦截器配置

3.3.1 针对某种mapping配置拦截器

<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"><property name="interceptors"><list><ref bean="handlerInterceptor1"/><ref bean="handlerInterceptor2"/></list></property></bean><bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/><bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>

 

3.3.2 针对所有mapping配置全局拦截器

 <!--拦截器 --><mvc:interceptors><!--多个拦截器,顺序执行 --><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.sihai.springmvc.filter.HandlerInterceptor1"></bean></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.sihai.springmvc.filter.HandlerInterceptor2"></bean></mvc:interceptor></mvc:interceptors>

 

3.4 正常流程测试

3.4.1 代码:

定义两个拦截器分别为:HandlerInterceptor1和HandlerInteptor2,每个拦截器的preHandler方法都返回true。

3.4.2 运行流程

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

HandlerInterceptor2..postHandle..

HandlerInterceptor1..postHandle..

HandlerInterceptor2..afterCompletion..

HandlerInterceptor1..afterCompletion..

3.5 中断流程测试

3.5.1 代码:

定义两个拦截器分别为:HandlerInterceptor1和HandlerInteptor2。

3.5.2 运行流程

HandlerInterceptor1的preHandler方法返回false,HandlerInterceptor2返回true,运行流程如下:

HandlerInterceptor1..preHandle..

从日志看出第一个拦截器的preHandler方法返回false后第一个拦截器只执行了preHandler方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且controller也不执行了。

HandlerInterceptor1的preHandler方法返回true,HandlerInterceptor2返回false,运行流程如下:

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

HandlerInterceptor1..afterCompletion..

从日志看出第二个拦截器的preHandler方法返回false后第一个拦截器的postHandler没有执行,第二个拦截器的postHandler和afterCompletion没有执行,且controller也不执行了。

总结:

preHandle按拦截器定义顺序调用

postHandler按拦截器定义逆序调用

afterCompletion按拦截器定义逆序调用

postHandler在拦截器链内所有拦截器返成功调用

afterCompletion只有preHandle返回true才调用

3.6 拦截器应用

3.6.1 用户身份认证

Public class LoginInterceptorimplements HandlerInterceptor{@OverridePublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler)throws Exception {//如果是登录页面则放行if(request.getRequestURI().indexOf("login.action")>=0){return true;}HttpSession session = request.getSession();//如果用户已登录也放行if(session.getAttribute("user")!=null){return true;}//用户没有登录挑战到登录页面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);return false;}}

3.6.2 用户登陆controller

//登陆页面@RequestMapping("/login")public String login(Model model)throws Exception{return "login";}//登陆提交//userid:用户账号,pwd:密码@RequestMapping("/loginsubmit")public String loginsubmit(HttpSession session,String userid,String pwd)throws Exception{//向session记录用户身份信息session.setAttribute("activeUser", userid);return "redirect:item/queryItem.action";}//退出@RequestMapping("/logout")public String logout(HttpSession session)throws Exception{//session过期session.invalidate();return "redirect:item/queryItem.action";}

springMVC教程--拦截器详解相关推荐

  1. SpringMVC拦截器详解

    SpringMVC之拦截器 拦截器概述 1.1什么是拦截器(HandleUbterceper) 拦截器可以在目标方法执行之前进行一些拦截工作,或者在目标方法执行过后进行一些操作.在javaWeb的学习 ...

  2. 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.   ...

  3. 第五章 处理器拦截器详解

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

  4. structs2拦截器详解

    Struts2(XWork)提供的拦截器的功能说明: 拦截器 名字 说明 Alias Interceptor alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变 Chaining In ...

  5. 一文贯通→过滤器与拦截器详解

    一.过滤器Filter 过滤器英文叫 Filter,是 JavaEE 的标准,依赖于 Servlet 容器,可以按照指定顺序配置多个.常用来配置请求编码以及过滤一些非法参数,垃圾信息或者是网站登录验证 ...

  6. java参数action_Struts2之Action接收请求参数和拦截器详解

    技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API 需求:提供JSP的表单页面的数据,在Action中使用Servlet的A ...

  7. struts2 18拦截器详解(五)

    I18nInterceptor 该拦截器处理defaultStack第四的位置,是用来方便国际化的,如果说我们的一个Web项目要支持国际化的话,通常的做法是给定一个下拉框列出所支持的语言,当用户选择了 ...

  8. AspectCore动态代理中的拦截器详解(一)

    前言 在上一篇文章使用AspectCore动态代理中,简单说明了AspectCore.DynamicProxy的使用方式,由于介绍的比较浅显,也有不少同学留言询问拦截器的配置,那么在这篇文章中,我们来 ...

  9. ​​​​​​过滤器和拦截器详解

    过滤器 和 拦截器的 6个区别,别再傻傻分不清了_程序员小富的博客-CSDN博客_过滤器和拦截器 若依登陆过程及过滤器拦截器的使用: 用户登陆接口:1.把用户信息通过uuid即token作为key,存 ...

最新文章

  1. 面经:为了拿到字节跳动offer,鬼知道我经历了啥...
  2. R语言可视化包ggplot2绘制分组的条形图(bar plot、柱状图)实战:多变量柱状图
  3. 04 javascirpt基础知识---听课笔记
  4. iOS之深入解析预乘透明度Premultiplied Alpha
  5. Cognos 10.1 饼图百分比小数点显示的问题
  6. 小程序和android联调,小程序打开APP指定页面
  7. mysql 查询列表是否关注_点赞功能,用mysql还是redis?
  8. EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法...
  9. android逐帧播放器,Kinovea(逐帧播放器)
  10. windows计算机日志时间id6008,windows错误事件id6008修复方法
  11. 思科网络实验3.5.3 vlan配置故障排除
  12. 转:学会正念沟通,领导力再也不是玄学
  13. TcaplusDB X 黎明觉醒,探索不止,黎明将至
  14. 玩转Linux与运维岗(21)
  15. 360怎样修改wifi服务器,360路由器怎么设置无线网络
  16. 6-5 奇数值结点链表 (20分)
  17. 触动千亿电商市场 BitCherry星耀雅加达
  18. 【十一】消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
  19. 用Java实现递归与分治系列(二)
  20. Koa2仿知乎服务端项目:Webpack配置

热门文章

  1. 二十、 二叉树的同构
  2. 计算机区块链的杂志,计算机类 | SPE诚邀区块链专刊(CCF B类,IF:1.338)
  3. c++新特性11 (10)shared_ptr一”概述“
  4. C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI
  5. Bech32编码 (1)产生背景
  6. PKI/CA (1)为什么要有PKI/CA体系?
  7. 【Flask项目2】创建模型类映射到数据库,密码加密实现(3)
  8. python基础-引用赋值与按值赋值
  9. 写博客必备的复制黏贴
  10. Git 工作区、暂存区和版本库