需要实现HandlerInterceptor接口
一个项目可以0或多个拦截器,一起拦截用户请求
常用在:用户登陆处理,权限检察,记录日志等
使用步骤
- 定义类实现HandlerInterceptor接口(有三个方法)
- preHandle(预处理方法)
- postHandle(后处理方法)
- afterCompletion(最后处理方法)
- 在springmvc配置文件中声明拦截器
拦截时间
- 在请求处理之前,也就是在controller类中的方法执行之前被拦截
- 在控制器方法处理之后
- 在请求处理完成后
springmvc配置文件中声明拦截器
<!--声明拦截器,可以有0或多个-->
<mvc:interceptors>
<!-- 声明第一一个拦截器,先声明的先执行,在框架中保存的是ArrayList集合-->
<mvc:interceptor>
<!-- path:指定拦截请求URI地址,可以使用通配符**
**:表示任意字符、文件或多级目录下的文件
-->
<mvc:mapping path="/student/**"/>
<!-- 被拦截的时候都有下面对象处理-->
<bean class="handler.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
创建拦截控制器类
在这里插入代码片
拦截不通过
用响应返回内容
PrintWriter writer = response.getWriter();
writer.println("logFalse");
return false;
拦截请求后,如果不通过可以通过请求转发或者重定向给浏览器一个反馈
request.getRequestDispatcher("/WEB-INF/jsp/lanjie.jsp").forward(request,response);
return false;
多个拦截器
按以上方法声明创建即可,先声明的先拦截,按顺序来,是一个ArrayList集合
拦截器和过滤器的区别
- 拦截器是框架中的对象(离开框架就不存在 ),过滤器是Servlet中的对象
- 拦截器是实现HandlerInterceptor接口,过滤器是实现Filter接口
- 过滤器是用来设置request,response请求参数、属性的,侧重对数据过滤。拦截器是用来对请求进行拦截的。二者侧重的功能方向不一样。
- 过滤器是在拦截器之前执行的
- 过滤器是Tomcat创建的对象,拦截器是springmvc容器创建的对象。
- 过滤器只有一个执行时间点,而拦截器有三个执行时间点
- 过滤器可以过滤jsp、js、html等。拦截器侧重拦截对Controller对象,如果请求没有被DispatcherServlet接收,这个请求不会执行拦截器内容。
拦截器实现,登陆验证
为了简单,登陆用一个jsp直接登陆,用session保存登陆状态
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% session.setAttribute("name","zss");%>
</body>
</html>
logout.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%session.removeAttribute("name");%>
</body>
</html>
拦截器
//拦截器类,拦截用户的请求
public class MyInterceptor implements HandlerInterceptor {
@Override
//预处理方法,Object handler就是被拦截的控制器controller对象
//在控制器方法之前先执行的
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//验证登录型信息
Object name = request.getSession().getAttribute("name");
String loginName="";
if(name!=null){
loginName=(String)name;
}
if(!"zs".equals(loginName)){
// PrintWriter writer = response.getWriter();
// writer.println("logFalse");
request.getRequestDispatcher("/WEB-INF/jsp/lanjie.jsp").forward(request,response);
return false;
}
return true;
}
//后处理方法,方法执行之后,能通过modelAndView对象修改结果
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//最后处理方法
//exception,程序中发生的异常
//请求处理完成后:框架中规定视图处理完成后,也就是对视图进行forward之后,认为请求处理完成
//一般做资源回收工作,如请求过程中创建了一些对象,可以在这里删除,把占用的内存进行回收
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}