拦截器可以帮助我们完成一些用户状态的统一检查、请求参数的统一检查、日志的记录等,在 SpringBoot 中可以通过继承 HandlerInterceptor 来实现我们的拦截器,然后简单配置一下就可以使拦截器生效了。
一 增加拦截器
我们增加一个登录拦截器模拟对是否登录的状态统一处理:
package com.qinshou.springbootdemo.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Description:登录拦截器
* Author: QinHao
* Date: 2019/8/13 14:45
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 通过请求参数中是否带有 token 来判断是否登录
if (request.getParameter("token") == null||request.getParameter("token") .equals("")) {
System.out.println("token is null");
return false;
}
return true;
}
}
然后修改一下之前的 ComputerController 为了后面的演示:
package com.qinshou.springbootdemo.controller;
import com.qinshou.springbootdemo.bean.ComputerBean;
import com.qinshou.springbootdemo.service.IComputerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Description:计算机模块的 Controller
* Author: QinHao
* Date: 2019/8/1 13:40
*/
@RestController
@RequestMapping(value = "/computer")
public class ComputerController {
@Autowired
private IComputerService mComputerService;
@RequestMapping(value = "/selectAll", method = RequestMethod.GET)
public List<ComputerBean> selectAll() {
return mComputerService.selectAll();
}
@RequestMapping(value = "/selectAllByBrand", method = RequestMethod.GET)
public List<ComputerBean> selectLAllByBrand(@RequestParam(name = "brand") String brand) {
return mComputerService.selectAllByBrand(brand);
}
@RequestMapping(value = "/select", method = RequestMethod.GET)
public ComputerBean select(@RequestParam(name = "id") int id) {
return mComputerService.select(id);
}
}
二 配置拦截器
写了拦截器它并不会自动生效,我们需要配置一下,在配置的时候还可以加入一些个性化配置:
package com.qinshou.springbootdemo.config;
import com.qinshou.springbootdemo.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* Description:拦截器配置类
* Author: QinHao
* Date: 2019/8/13 14:59
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
// 指定拦截的 url
.addPathPatterns("/computer/**")
// 指定不拦截的 url
.excludePathPatterns("/computer/select");
}
}
注意这个配置类与之前的 DruidConfig、FastJsonConfiguration 不太一样,除了加了 @Configuration 注解之外还继承了 WebMvcConfigurer 类,并重写了它的 addInterceptors 方法,从方法名就可以看出这是用来添加拦截器的,我们在这个方法中添加刚才的 LoginInterceptor,并指定了一些过滤规则。
四 测试
按照上面的规则,我们会过滤所有 /computer/ 开头的请求,除了 /computer/select 之外的 url,不带 token 参数的话都会被拦截,测试 selectAll:
可以看到页面上并没有返回任何内容,后台也打印出了错误,然后测试 selectAllByBrand:
同样的结果,然后再测试 selectAllByBrand 加上 token 参数和 select 不加 token 参数:
页面上返回了内容,后台打印中也执行了 SQL,说明我们的个性化配置是生效了,拦截器完美的完成了它的使命。在开发中拦截器是很有用的,可以帮我们完成很多需要统一处理的工作。