五、拦截器

SpringMVC中的拦截器是通过HandlerInterceptor来实现的,定义一个Interceptor有两种方式

1、实现HandlerInterceptor接口或者继承实现了HandlerInterceptor接口的类,例如抽象类HandlerInterceptorAdapter

HandlerInterceptor 接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。

public class SpringMVCInterceptor implements HandlerInterceptor{
/**
* preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在
* 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。
* SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返 回值为false,
* 当preHandle的返回值为false的时候整个请求就结束了。
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return false;
}
/**
* 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。
* postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之 后,也就是在Controller的方法调用之后执行,
* 但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操 作。
* 这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用.
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
/**
* 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。
* 该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,
* 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex)
throws Exception { }
}

2、实现WebRequestInterceptor接口或这继承实现了WebRequestInterceptor接口的类。

WebRequestInterceptor 中也定义了三个方法,我们也是通过这三个方法来实现拦截的。这三个方法都传递了同一个参数WebRequest ,WebRequest 是Spring 定义的一个接口,它里面的方法定义都基本跟HttpServletRequest 一样,在WebRequestInterceptor 中对WebRequest 进行的所有操作都将同步到HttpServletRequest 中,然后在当前请求中一直传递。

public class SpringMVCInterceptor2 implements WebRequestInterceptor{
/**
* preHandle(WebRequest request) 方法。该方法将在请求处理之前进行调用,也就是说会在Controller 方法调用之前被调用。
* 这个方法跟HandlerInterceptor 中的preHandle 是不同的,主要区别在于该方法的返回值是void ,也就是没有返回值,
* 所以我们一般主要用它来进行资源的准备工作,比如我们在使用Hibernate 的时候可以在这个方法中准备一个Hibernate 的Session 对象,
* 然后利用WebRequest 的setAttribute(name, value, scope)把它放到WebRequest 的属性中。
* 这里可以说说这个setAttribute 方法的第三个参数scope ,该参数是一个Integer类型的。在WebRequest 的父层接口RequestAttributes 中对它定义了三个常量:
* SCOPE_REQUEST :它的值是0 ,代表只有在request 中可以访问。
* SCOPE_SESSION :它的值是1 ,如果环境允许的话它代表的是一个局部的隔离的session,否则就代表普通的session,并且在该session范围内可以访问。
* SCOPE_GLOBAL_SESSION :它的值是2 ,如果环境允许的话,它代表的是一个全局共享的session,否则就代表普通的session,并且在该session 范围内可以访问。
*
*/
public void preHandle(WebRequest request) throws Exception {
System.out.println("AllInterceptor...............................");
request.setAttribute("request", "request", WebRequest.SCOPE_REQUEST);
request.setAttribute("session", "session", WebRequest.SCOPE_SESSION);
request.setAttribute("globalSession", "globalSession", WebRequest.SCOPE_GLOBAL_SESSION);
}
/**
* postHandle(WebRequest request, ModelMap model) 方法。该方法将在请求处理之后,也就是在Controller 方法调用之后被调用,
* 但是会在视图返回被渲染之前被调用,所以可以在这个方法里面通过改变数据模型ModelMap 来改变数据的展示。
* 该方法有两个参数,WebRequest 对象是用于传递整个请求数据的,比如在preHandle 中准备的数据都可以通过WebRequest 来传递和访问;
* ModelMap 就是Controller 处理之后返回的Model 对象,我们可以通过改变它的属性来改变返回的Model 模型
*/
public void postHandle(WebRequest request, ModelMap model) throws Exception {
}
/**
* 该方法将在整个请求完成之后,也就是说在视图渲染之后进行调用,主要用于进行一些资源的释放
*/
public void afterCompletion(WebRequest request, Exception ex) throws Exception {
}
}
<mvc:interceptors>  

    <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->  

    <bean class="com.host.app.web.interceptor.AllInterceptor"/>  

    <mvc:interceptor>  

        <mvc:mapping path="/test/number.do"/>  

        <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->  

        <bean class="com.host.app.web.interceptor.LoginInterceptor"/>  

    </mvc:interceptor>  </mvc:interceptors>

六、乱码问题

<mvc:annotation-driven >
<mvc:message-converters register-defaults="true">
<!-- 解决@ResponseBody中文乱码 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

最新文章

  1. 详解Js中文件读取机制
  2. 5. Longest Palindromic Substring
  3. Mysql 死锁的详细分析方法
  4. python 把函数作为参数 ---高阶函数
  5. 查询mysql当前连接数
  6. struts2 权限拦截器 拦截没有登陆的请求
  7. 数据关联分析 association analysis (Aprior算法,python代码)
  8. 打开较大存储量的.sql文件时,出现SQL Server 阻止了对组件 &#39;xp_cmdshell&#39; 的 过程&#39;sys.xp_cmdshell&#39; 的访问
  9. OCP-1Z0-051-题目解析-第29题
  10. LWIP_STM32_ENC28J60_NETCONN_UDP(3)
  11. three.js 文字显示不出来
  12. 那些年Android开发中遇到的坑
  13. BuautifulSoup4库详解
  14. Servlet的 GenericServlet 和 HttpServlet
  15. noip第21课资料
  16. awk命令的基本使用
  17. Azure PowerShell (15) 批量导出Azure ASM/ARM VM信息
  18. Exceptions
  19. es6 学习小记 扩展运算符 三个点(...)
  20. python 形参

热门文章

  1. 自动机器学习(AutoML)
  2. (1)http基础
  3. java笔试题(二)
  4. 「模拟8.21」山洞(矩阵优化DP)
  5. CMD批处理(1)——批处理常用命令总结
  6. WEB安全新玩法 [3] 防护交易数据篡改
  7. excel VBA数组运用
  8. 对volatile的理解--从JMM以及单例模式剖析
  9. 17 DOS攻击防范
  10. Docker:Docker常用命令