在WEB应用当中,有时候我们需要在某一个特定的操作之前做一些判断,比如在将商品添加进购物车之前判断用户是否登录,或者在某一请求之前判断用户是否有权限使用该功能,那么这些情况下我们就要使用到Interceptor了,在SpringMVC当中,配置一个自定义的拦截器是十分简单的,主要步骤就是两步:1.新建拦截器类 。2.在SpringMVC中配置拦截器类。
下面我直接上代码,首先是Intercepor:
package com.demo.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
/**
* 该方法将在请求处理之前进行调用,只有该方法返回true,才会继续执行后续的Interceptor和Controller,
* 当返回值为true 时就会继续调用下一个Interceptor的preHandle 方法,
* 如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法;
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//此方法在handler被调用之前调用
System.out.println("preHandle******");
//返回值,true则放行否则一直阻塞相应的handler
return true;
}
/**
* 该方法将在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用
* 可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle******");
}
/**
* 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,该方法将在整个请求结束之后,
* 也就是在DispatcherServlet 渲染了对应的视图之后执行。用于进行资源清理。
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//此方法在handler返回之后调用
System.out.println("afterCompletion******");
}
}
SpringMVC中的配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/test"/>
<bean class="com.demo.Interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
Controller的代码:
package com.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class InterceptorController {
@RequestMapping("/test")
@ResponseBody
public String test(){
System.out.println("testContoller");
return "ok";
}
}
测试结果:
23-Apr-2018 19:55:24.906 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory D:\apache-tomcat-8.0.47\webapps\manager
23-Apr-2018 19:55:24.953 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory D:\apache-tomcat-8.0.47\webapps\manager has finished in 46 ms
preHandle******
testContoller
postHandle******
afterCompletion******
用起来还是挺简单的,至于里边的参数,request和response和controller是同一个,其余的参数等遇到的时候在细说!