用过SpringMVC的都知道要自定义拦截器只需要继承HandlerInterceptorAdapter类或者实现HandlerInterceptor接口;然后使用的时候需要在XML里面配置一下,比如
<mvc:interceptors>
<bean class="com.zycz.interceptor.MyHandleInterceptor" />
</mvc:interceptors>
而SpringBoot里面是没有xml文件的,在演示SpringBoot里怎么是使用自定义的拦截器之前,先说说拦截器使用场景。比如权限校验、对于非法url重定向去登录界面,还有在拦截器里可以使用业务服务,因此也可以处理一些业务预处理等。下面具体代码实战。
自定义拦截器
首先创建自定义拦截器,实现HandlerInterceptor接口。看下面方法注释,三个方法的执行顺序写的很清楚,后面会打印时间来验证。一般项目中只需要使用preHandle这个方法。
public class MyHandlerInterceptor implements HandlerInterceptor{
/**
* preHandle在执行Controller之前执行,返回true,则继续执行Contorller
* 返回false则请求中断。
* @param request
* @param response
* @param handler
* @return
* @throws Exception
* @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行preHandle当前时间 ==>" + System.currentTimeMillis());
//这里对名叫param的请求参数进行拦截
String param = request.getParameter("param");
if (!StringUtils.isEmpty(param)) {
return true;
}
//如果参数为空,中断请求
System.out.println("参数不能为空");
return false;
}
/**
* postHandle是在请求执行完,但渲染ModelAndView返回之前执行
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
* @see org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.web.servlet.ModelAndView)
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("执行postHandle当前时间 ==>" + System.currentTimeMillis());
System.out.println("我是postHandle");
}
/**
* afterCompletion是在整个请求执行完毕后执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
* @see org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("执行afterCompletion当前时间 ==>" + System.currentTimeMillis());
System.out.println("我是afterCompletion");
}
}
配置MVC
这一步就类似文章开头说的Springmvc里配置下面语句一样
<mvc:interceptors>
<bean class="com.zycz.interceptor.MyHandleInterceptor" />
</mvc:interceptors>
具体代码
/***
* mvc配置类,也可以实现WebMvcConfigurer接口,这里选择
* 继承WebMvcConfigurerAdapter,因为只需要重写一下添加
* 拦截器的方法就可以
* @author 沉鱼
* @date 2017年12月28日 下午2:08:28
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
/**
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myHandlerInterceptor());
}
/***
* MyHandlerInterceptor自己定义的拦截器
* @author 沉鱼
* @date 2017年12月28日 下午2:39:32
* @return MyHandlerInterceptor
*/
@Bean
public MyHandlerInterceptor myHandlerInterceptor() {
return new MyHandlerInterceptor();
}
}
请求接口
还是我之前写的很简单的一个接口,接口中包含我的另一篇文章SpringBoot整合Swagger2输出REST API
@RestController
// @ApiIgnore
@Api(tags = { "myproject" }, description = "我的工程接口详情")
public class MyProjectc {
@ApiOperation(value = "展示你所输入的内容", notes = "根据客户端输入的内容返回同样的内容", response = String.class)
@ApiImplicitParams({ @ApiImplicitParam(name = "param", value = "输入要返回的内容", required = false, dataType = "String", paramType = "query") })
@RequestMapping(value = "/showWhatYouSay", method = RequestMethod.POST)
public String showWhatYouSay(String param) {
System.out.println("执行showWhatYouSay当前时间==>" + System.currentTimeMillis());
Map<String, Object> map = new HashMap<>();
map.put("result", param);
return JSONObject.toJSONString(map);
}
}
验证
在postman里请求接口,参数param=well done
看看控制台打印,其中红框中的内容,是我写的切面aop用来统计接口响应时间,可以看下我的另一篇文章SpringBoot整合Aop
再在postman里将参数param传空,这样,在preHandle方法里,返回false,这样请求就中断了,我们试一试。控制台只打印
执行preHandle当前时间 ==>1514445222549
参数不能为空
说明验证通过,谢谢。