12. 拦截器
12.1. 定义类实现拦截器接口
需要实现,并实现抽象方法HandlerInterceptor
java
package com.neuedu.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
/**
* 项目 : spring-mvc-java1
* 创建时间 :2020/3/31 13:47 31
* author :jshand-root
* site : http://314649444.iteye.com
* 描述 : 登录的拦截器
*/
public class ValidateLoginInterceptor implements HandlerInterceptor {
/**
* 在控制器方法之前执行的
* @param request
* @param response
* @param handler
* @return false:控制的方法不会就行执行,同时postHandle、afterCompletion 方法也都不会继续执行
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("登录的拦截器:preHandle");
return true;
}
/**
* 在控制器方法之后执行 ,如果有异常不会执行
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("登录的拦截器:postHandle");
}
/**
* 在控制器方法之后执行 有异常也正常的执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("登录的拦截器:afterCompletion");
}
}
12.2. 将拦截器配置到具体的HandlerMapping上
xml
<mvc:interceptors>
<mvc:interceptor>
<!--
http://127.0.0.1:8080/springmvc/abc
http://127.0.0.1:8080/springmvc/def -->
<!-- <mvc:mapping path="/*" />-->
<!--
包含子目录
http://127.0.0.1:8080/springmvc/user/insert
http://127.0.0.1:8080/springmvc/user/update
-->
<mvc:mapping path="/**" />
<bean class="com.neuedu.interceptor.ValidateLoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
12.3. 测试
12.3.0.1. 单个拦截器并且preHandler方法返回false
12.3.0.2. 单个拦截器并且preHandler方法返回true
12.3.1. preHandle
在控制器方法之前执行的,
返回结果
True:相当于是FIlter的放行
False:后续的拦截器方法(postHandle、afterCompletion),控制器方法都不执行
12.3.2. postHandle
如果控制器方法没有异常,则在方法之后执行postHandle,如果有异常则此方法不会执行。
12.3.3. afterCompletion
在控制器方法之后执行postHandle,无论是否存在异常。
12.4. 多个拦截器
第二个拦截器
java
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 项目 : spring-mvc-java1
* 创建时间 :2020/3/31 13:47 31
* author :jshand-root
* site : http://314649444.iteye.com
* 描述 : 设置中文编码的拦截器
*/
public class CharsetInterceptor implements HandlerInterceptor {
/**
* 在控制器方法之前执行的
* @param request
* @param response
* @param handler
* @return false:控制的方法不会就行执行,同时postHandle、afterCompletion 方法也都不会继续执行
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
System.out.println("1 编码的拦截器:preHandle");
return true;
}
/**
* 在控制器方法之后执行 ,如果有异常不会执行
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("1 登录的拦截器:postHandle");
}
/**
* 在控制器方法之后执行 有异常也正常的执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("1 登录的拦截器:afterCompletion");
}
}
12.5. 多个拦截器preHandle方法返回true
12.6. 多拦截器的总结
当第一个拦截器返回true的时候,afterCompletion方法可以执行,第二个拦截器返回false后续的方法都不执行。只要有一个拦截器返回fasle则控制器的方法就不执行。
建议将必须要执行的拦截器前置(例如:无论是否登录成功都需要设置的编码的拦截器)
