拦截器
拦截器是类似于过滤器的一个概念,其功能和过滤器一致,其主要概念不再赘述,想要了解的读者可以查看博主关于Filter的文章
下面演示SpringMvc拦截器的使用。
环境搭建和博主的上一篇文章一致,这里不再赘述。
直接创建一个HelloController类作为处理器:
package com.ara.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello(){
System.out.println("Hello");
return "hello";
}
@RequestMapping("/world")
@ResponseBody
public String world(){
System.out.println("world");
return "world";
}
@RequestMapping("/ara")
@ResponseBody
public String ara(){
System.out.println("ara");
return "ara";
}
}
现在我们就想着有一个拦截器,拦截除了/hello的所有请求。
自定义一个拦截器MyInterceptor,这里采用实现HandlerInterceptor接口的方式:
package com.ara.config;
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 {
/**
* 该方法在拦截前执行
* @param request 请求的request
* @param response 响应
* @param handler 请求的处理器
* @return 返回是否放行 true:放行 false:不放行
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("处理请求前的代码..........");
return true;
}
/**
* 该方法在请求处理完成后执行
* @param request 处理之后的request
* @param response 响应给客户端的response对象
* @param handler 请求的处理器
* @param modelAndView 处理后返回的模型和视图对象
* @throws Exception
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("处理器处理完请求后的代码.........");
}
/**
* 该方法主要做一些清理工作 在拦截请求全部完成后执行
* @param request 请求的request对象
* @param response 响应的response对象
* @param handler 执行请求的处理器
* @param ex 异常对象
* @throws Exception
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("清理工作........");
}
}
这时,我们还要将该拦截器配置在Spring中,即在spring-mvc.xml文件中添加如下配置:
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--包括这个请求下面的所有请求-->
<mvc:mapping path="/**"/>
<!--除了这个请求的所有请求-->
<mvc:exclude-mapping path="/hello"/>
<!--配置处理的拦截器-->
<bean class="com.ara.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
现在就配置完毕了,我们开始测试,分别访问/hello、/world和/ara,其控制台结果如下:
- /hello
- /world
- /ara
到此,拦截器就实现成功了。