SpringBoot整合Interceptor

用过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
参数不能为空

说明验证通过,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值