springMVC学习 十二 拦截器
一 拦截器概述
拦截器技术比较像java web技术中的过滤器技术,都是发送 请求时被拦截器拦截,在控制器的前后添加额外功能。但是和Spring中的Aop技术是由区别的。AOP 在特定方法前后扩充(一般是对 ServiceImpl的方法进行扩充),而拦截器是对控制器的请求进行拦截。
但是拦截器和java web的过滤器也是有区别的,拦截器只能拦截控制器的请求,对jsp和静态资源不拦截,因为拦截器是SpingMVC的技术,SpringMVC的总入口是DispatcherServlet,我们在配置DsipatcherServlet时,就已经把DispatcherServlet可以接收的请求限定为Controller的请求。而Java Web中的 Filter 可以拦截任何请求。
二 实现自定义拦截器
第一步:创建一个拦截器类,并继承HandlerInterceptor接口
在HandlerInterceptor接口中有三个方法
(1)preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2)
执行时间:控制器之前执行
如果返回值为true,则放行到控制器,
如果返回值为false,直接返回,不放行,
一般情况下,如果不放行,一般会sendRedirect("")让其跳转到一个特定的页面, arg2:要拦截的控制器的方法
(2)postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception
执行时间:控制器之后,jsp执行之前 执行,如果控制器抛出了异常,便不会走该方法
arg3:模型和视图
功能:一般用来记录日志,或者敏感词过滤
structs的后置拦截器是无法修改ModelAndView,但是springMVC是可以修改的,也就是ModelAndView的值是可以修改的
(3)afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception
执行时间:执行完jsp之后才执行 根据arg3参数是否为null来判断是否出现了异常
无论是否出现异常,该方法都会执行,因为有一个Exception类型的参数,因此可以用来记录异常
package com.ssm.interceptor; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; public class DemoInterceptor implements HandlerInterceptor{ /**
* 控制器之前执行,如果返回值为true,则放行到控制器,如果返回值为false,直接返回,不放行,一般情况下,如果不放行,一般会sendRedirect("")
* 让其跳转到一个页面
* arg2:要拦截的控制器的方法
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("preHandle方法执行了");
return true;
}
/**
* 控制器之后,jsp执行之前 执行,如果控制器抛出了异常,便不会走该方法
* arg3:模型和视图
* 功能:一般用来记录日志,或者敏感词过滤
* structs的后置拦截器是无法修改ModelAndView,但是springMVC是可以修改的,也就是ModelAndView的值是可以修改的
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("postHandle 方法执行了");
System.out.println(arg3.getViewName());
System.out.println(arg3.getView()); System.out.println(arg3.getModel().get("modelKye")); }
/**
* 执行完jsp之后才执行
*
* 根据arg3参数是否为null来判断是否出现了异常
* 无论是否出现异常,该方法都会执行,因为有一个Exception类型的参数,因此可以用来记录异常
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion方法执行了"); } }
三 配置拦截器,就像Filter一样,拦截器也需要配置
在SpringMVC的配置文件中进行配置,有两种配置方式,一种是拦截所有请求,第二种是拦截特定请求。
下面的代码是拦截所有请求,拦截特定请求的被注释了
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 表示所有的控制器请求都拦截 -->
<bean class="com.ssm.interceptor.DemoInterceptor"></bean>
<!-- 拦截特定请求 -->
<!-- <mvc:interceptor>
<mvc:mapping path="/demo"/>
<bean class="com.ssm.interceptor.DemoInterceptor"></bean>
</mvc:interceptor> -->
</mvc:interceptors>
springMVC学习 十二 拦截器的更多相关文章
- spring boot 学习(十二)拦截器实现IP黑名单
拦截器实现IP黑名单 前言 最近一直在搞 Hexo+GithubPage 搭建个人博客,所以没怎么进行 SpringBoot 的学习.所以今天就将上次的”?秒防刷新”进行了一番修改.上次是采用注解加拦 ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- SpringMVC学习记录(七)--拦截器的使用
SpringMVC的请求如以下这样的图所看到的: 能够看出全部的请求都要通过Dispatherservlet来接收,然后通过Handlermapping来决定使用哪个控制器,再依据ViewResolv ...
- SpringMVC学习笔记九:拦截器及拦截器的简单实用
SpringMVC中的interceptor拦截器是非常重要的,它的主要作用就是拦截指定的用户请求,并进行相应的预处理和后处理. 拦截时间点在"处理器映射器根据用户提交的请求映射出所要执行的 ...
- SpringMVC 学习笔记(六)拦截器
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
- springMVC学习(12)-使用拦截器
一.拦截器配置和测试: 1)定义两个拦截器,(要实现HandlerInterceptor接口) HandlerInterceptor1: package com.cy.interceptor; imp ...
- SpringMVC学习08(拦截器)
8.拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自己定义一些拦截器来实现特定的功能. 过滤器与拦截器的区别: ...
- SpringMVC学习笔记:拦截器和过滤器
首先说明一下二者的区别: 1. 拦截器基于java的反射机制,而过滤器是基于函数回调 2. 拦截器不依赖于servlet容器,过滤器依赖servlet容器 3. 拦截器只能对action请求起作用,而 ...
- springmvc学习笔记二:重定向,拦截器,参数绑定
Controller方法返回值 返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. 返回void 在Contro ...
随机推荐
- 12月中旬项目中出现的几个bug解决方法的思考
这周做的项目遇到2个费了很多时间才解决的bug,解决之后,发现根本问题并不是什么很难的技术难点,都是因为自己在写代码的过程中,思维不够清晰.还有一个需要再提高的地方就是解决问题的思维,如何快速定位到问 ...
- hash的排序(转载)
sort函数 sort LISTsort BLOCK LISTsort SUBNAME LIST sort 的用法有如上3种形式.它对LIST进行排序,并返回排序后的列表.假如忽略了SUBNAME或B ...
- .net 调用 Matlab生成dll出现的问题(The type initializer for 'MathWorks.MATLAB.NET.Utility.MWMCR' threw an exception.)
https://cn.mathworks.com/matlabcentral/answers/278399-i-get-an-error-saying-the-type-initializer-for ...
- linux服务nfs与dhcp篇
nfs复习: 1.简介:用于liunx与linux之间的文件传输系统 2.下载nfs-utils和rpcbind 3.打开配置文件/etc/exports——文件名(目录名)共享给予的ip地址(rw) ...
- mysql六种日志
错误日志 MySQL服务启动和关闭过程中的信息以及其它错误和警告信息.默认在数据目录下 普通查询日志 用于记录select查询语句的日志.general_log.general_log_file 默认 ...
- WPF 流加载
/// <summary> /// datatable分页 /// </summary> /// <param name="dt">源datat ...
- JavaScript学习-4——DOM对象、事件
本章目录 --------window对象 --------document对象 --------事件 一.window对象 函数调用: 自己封装的函数只写:函数名(): 数学函数Math 例:绝对值 ...
- IDEA使用SpringBoot 、maven创建微服务的简单过程
使用IDEA新建一个简单的微服务 1. 打开IDEA,File -> New -> project 打开如下图1-1所示的对话框 图 1-1 2.点击"Next"按钮 ...
- linux目录与文件权限的意义
现在我们已经知道了Linux系统内文件的三种身份(所有者,用户者,与其他人),知道每种身份都有三种属性(r,w,x),已经能够使用chown,chgrp,chmod去修改这些权限和属性,那么这些文件权 ...
- mysql创建表和数据库
创建数据库,创建数据库表,例子.MySQL语句 1.创建数据库: 创建的代码:create 数据库的代码:database 数据库表名:随便起,只要自己记住就行.test create ...