自定义拦截器
-
什么是拦截器
1、在Spring MVC中可以使用拦截器对方法请求进行拦截处理,各位程序员可以自定义拦截器来实现特定的功能。
2、拦截器必须实现 HandlerInterceptor 接口。
-
自定义拦截器的三个方法
1、preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求的 request
进行处理。
2、postHandle():这个方法在目标方法处理完请求后执行。
3、afterCompIetion():这个方法在完全处理完请求后被调用,可以在该方法中进行一些资源的释放/清理等操作。
自定义拦截器执行流程分析图
-
自定义拦截器执行流程说明
1、如果 preHandle 方法 返回 false ,则就不在执行目标方法,可以在此之地那个返回页面。
2、postHandle 在目标方法被执行后执行,可以在方法中访问到目标方法返回的 ModelAndView 对象。
3、若 preHandle 返回 true,则 afterCompIetion 方法 在渲染视图之后被执行。
4、若 preHandle 返回 false,则 afterCompIetion 方法 不会被调用。
5、在配置拦截器时,可以指定该拦截器对哪些请求生效,哪些请求不生效。
自定义拦截器应用实例
例:如何配置拦截器以及拦截器的运行流程
- 实例代码
这里让类 实现 HandlerInterceptor 接口,来获取 HandlerInterceptor() 中的三个执行方法。
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//配置一个 @Component交给Spring MVC进行管理
@Component
public class MyInterceptor01 implements HandlerInterceptor {
/**
*1.preHandle() 在目标方法执行前被执行
* 2.如果preHandle() 返回false,不在执行目标方法
* 3.该方法可以获取到request,response,handler
* 4.这里根据业务,可以进行拦截,并指定需要跳转到哪个页面
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("--MyInterceptor01--preHandle()----");
return true;
}
/**
* 解读:
* 1.在目标方法执行后,会执行 postHandle()
* 2.该方法可以获取到 目标方法,返回modelAndView
* @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("--MyInterceptor01--postHandle()");
}
/**
* 解读:
* 1.afterCompletion() 在视图从渲染后被执行
* 2.可以执行资源处理
* @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("--MyInterceptor01--afterCompletion()");
}
}
接下来我们配置需要执行的目标方法。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class FurnHandler {
@RequestMapping(value = "/hi")
public String hi(){
System.out.println("--FurnHandler--hi()");
return "success";
}
@RequestMapping(value = "/hello")
public String hello(){
System.out.println("--FurnHandler--hello()");
return "success";
}
}
随后我们需要在Spring的 .xml 配置文件中配置拦截器
<!--配置自定义拦截器-->
<mvc:interceptors>
<!--解读:
1.第一种配置方式
2.ref 引用到对应的MyInterceptor01
3.这种方式,会拦截目标方法
-->
<ref bean="myInterceptor01"/>
</mvc:interceptors>
还有两种其余的方法!!!
<!--配置自定义拦截器-->
<mvc:interceptors>
<!--解读:
默认配置是都所有的目标方法都进行拦截, 也可以指定拦截目标方法, 比如只是拦截 hi
1.第二种配置方式
2.<mvc:mapping path="/hi"/> 指定要拦截的路径
3.<ref bean="myInterceptor01"/> 指定对那个拦截器进行配置
-->
<!--<mvc:interceptor>-->
<!-- <mvc:mapping path="/hi"/>-->
<!-- <ref bean="myInterceptor01"/>-->
<!--</mvc:interceptor>-->
<!--
mvc:mapping 支持通配符, 同时指定不对哪些目标方法进行拦截
解读:
1.第三种配置方式
2.<mvc:mapping path="/h*"/> 通配符方式 拦截‘h’打头的文件
3.<mvc:exclude-mapping path="/hello"/> 指定‘/hello’不拦截
4.<ref bean="myInterceptor01"/> 指定对那个拦截器进行拦截
-->
<mvc:interceptor>
<mvc:mapping path="/h*"/>
<mvc:exclude-mapping path="/hello"/>
<ref bean="myInterceptor01"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/h*"/>
<ref bean="myInterceptor02"/>
</mvc:interceptor>
</mvc:interceptors>
最后完成对客户端页面的请求。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试自定义拦截器</title>
</head>
<body>
<h1>测试自定义拦截器</h1>
<a href="<%=request.getContextPath()%>/hi">拦截--hi</a><br/>
<a href="<%=request.getContextPath()%>/hello">拦截--hello</a>
</body>
</html>