Spring学习笔记<四> AOP 拦截器的基本实现
来源:互联网 发布:xampp1.6.8设置mysql 编辑:程序博客网 时间:2024/06/06 01:37
1.添加文件
继续在《 Spring学习笔记<三> 获取请求对象和请求头》的项目基础上再添加三个文件:
test_Interceptor.jsp文件(WebContent文件夹下面)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>helloWorld</title></head><body> <a href="testInterceptor">testInterceptor</a> <br/><br/> <a href="testSecondInterceptor">testSecondInterceptor</a> <br/><br/></body></html>
InterceptorTest.java文件(com.shi.springmvc.interceptors包下面)
import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class InterceptorTest { private String SUCCESS = "success"; @RequestMapping(value = "/testInterceptor") public String testInterceptor() { System.out.println("testInterceptor被执行"); return SUCCESS; } @RequestMapping(value = "/testSecondInterceptor") public String testSecondInterceptor() { System.out.println("testSecondInterceptor被执行"); return SUCCESS; }}
还有两个实现了HandlerInterceptor接口的拦截器对象,在实现的三个方法中分别打印当前方法被执行了,以方便我们查看这些方法是否执行以及执行的顺序。
FirstInterceptor.java对象文件(com.shi.springmvc.interceptors包下面)
public class FirstInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("FirstInterceptor:afterCompletion被执行"); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("FirstInterceptor:postHandle被执行"); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("FirstInterceptor:preHandle被执行"); return true; }}
SecondInterceptor.java对象文件(com.shi.springmvc.interceptors包下面)
public class SecondInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("SecondInterceptor:afterCompletion被执行"); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("SecondInterceptor:postHandle被执行"); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("SecondInterceptor:preHandle被执行"); return true; }}
2. HandlerInterceptor接口
Spring MVC中对于一个请求可以添加多个拦截器,而这个拦截器集合中会链式调用这些拦截器。每个拦截器会执行固定顺序的方法,而这些方法就定义在HandlerInterceptor类中。这是拦截器的一个基础接口,里面有三个方法,分别是:
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
使用时机:在处理请求之前
应用场景:可以在该方法中放入一些初始化的操作,比如权限验证,日志管理等
注意:该方法的返回值是boolean类型,若返回值为true,则继续调用后面的拦截器和目标方法,若返回为false,则不会调用后面的拦截器和目标方法,表示请求结束
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception;
使用时机:在调用目标方法之后,渲染视图之前被调用。具体来说,是在调用了Controller中定义的方法之后,但在DispatcherServlet 处理视图返回渲染结果之前被调用。
应用场景:根据使用的时机就可以知道,该方法可以对Controller处理之后ModelAndView进行操作
注意:当有多个interceptor的时候,对于preHandler的调用顺序和postHandler的调用顺序是恰恰想法的。
举例来说,现在有一个FirstInterceptor和一个SecondInterceptor,单独调用FirstInterceptor的三个方法的顺序为:
FirstInterceptor.preHandle->HandlerAdapter.handle->FirstInterceptor.postHanle->DispatcherServlet.render->FirstInterceptor.afterCompletion。
对于两个interceptor的调用顺序大致如下:
可以总结出preHandler是先进先执行,而postHandler是先进后执行
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception;
使用时机:渲染视图之后
应用场景:释放资源
3.然后在springmvc.xml文件中添加:
<mvc:interceptors> <bean class="com.shi.springmvc.interceptors.FirstInterceptor"></bean> <mvc:interceptor> <!-- 特定请求拦截器,只拦截path=testSecondInterceptor的请求 --> <mvc:mapping path="/testSecondInterceptor" /> <bean class="com.shi.springmvc.interceptors.SecondInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
我们在配置文件配置拦截器FirstInterceptor和SecondInterceptor,并指定SecondInterceptor只对path=”/testSecondInterceptor”的请求进行拦截。
好了,看一下效果图:
最后附上demo下载地址:戳我进入
- Spring学习笔记<四> AOP 拦截器的基本实现
- Spring AOP 拦截器的基本实现
- Spring学习总结(15)——Spring AOP 拦截器的基本实现
- Spring AOP框架学习笔记(2):AOP拦截器调用的实现
- Spring学习笔记(四)Spring配置文件方式实现AOP
- Spring学习笔记(13)----------aop拦截器
- Spring AOP实现之拦截器调用的实现
- spring的aop拦截器
- Spring AOP源码分析(拦截器调用的实现)
- Spring AOP 源码分析 part4 :拦截器的实现
- spring AOP中对拦截器调用的实现
- AOP的实现:Spring注解形式拦截
- Spring AOP拦截器调用实现
- Spring学习笔记:面向切面(AOP)的基本定义
- Spring学习笔记(四)-----AOP
- Spring aop拦截器
- spring声明式事务策略 aop拦截-学习笔记
- Spring aop 实现异常拦截
- 半年学习总结
- CSS基础讲解(1)
- kylin restful使用验证失败解决
- ipad 上如何弹出UIActivityViewController
- Java传参的值传递和引用传递问题(转)
- Spring学习笔记<四> AOP 拦截器的基本实现
- Webservice简单调用示例
- 微信小程序开发tip1(开发过程的问题汇总)
- 响应链式编程RxJava
- Select2 4.0.3自动补全插件使用说明
- 实现RTP协议的h.264传输
- node.js安装小结
- How to Fix Windows Visual C++ Runtime Errors
- DWR动态在javascript里生成一个AjaxService类