第一步:创建SpringBoot项目,添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
第二步:自定义一个过滤器,实现Filter接口
- 重写doFilter方法,里面做自己的逻辑,比如可以获取到请求中携带的所有东西,比如验证token等。如果符合,一定要放行filterChain.doFilter(servletRequest, servletResponse)。
- 过滤器类上加上@WebFilter注解,表明这是个过滤器,并且配置上过滤的路径urlPatterns(这个路径是你controller上写的路径。过滤器就会过滤这个路径,使请求进入过滤器中)
@WebFilter(filterName = "tokenFilter", urlPatterns = "/api/*")
@Order(1)//指定过滤器的执行顺序,值越大越靠后执行
public class TokenFilter2 implements Filter {
@Override
//这个方法会在过滤器被创建之后马上执行,并且这个方法只会调用一次,在tomcat服务器启动时被创建。
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
//每次拦截目标资源的时候都会调用这个方法。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
//从请求头中获取到header
String auth = httpServletRequest.getHeader("Authorization");
if (!StringUtils.isEmpty(auth)) {
String token = "你制作的token";
if (token.equals(auth)) {
filterChain.doFilter(servletRequest, servletResponse);// 放行
}
}
//未通过验证,返回失败
httpServletResponse.setStatus(401);
httpServletResponse.setContentType("application/json");
httpServletResponse.getOutputStream().write("{\"code\":1001,\"msg\":\"No authority accessing current api.\",\"result\":false}".getBytes());
httpServletResponse.getOutputStream().flush();
httpServletResponse.getOutputStream().close();
return;
}
@Override
//这个方法会在过滤器被销毁之前执行,这个方法只会执行一次,过滤器会在tomcat服务器关闭的时候销毁。
public void destroy() {
}
}
第三步:Controller层
- 在controller类上 或 者主启动类上 加上@ServletComponentScan注解
- 这里的/api/ 下面的方法都会被过滤器过滤,见第二步配置了urlPatterns
@RestController
@RequestMapping("/api")
@ServletComponentScan
public class MyController {
@GetMapping("/test")
public void test(String name1, int age) {
System.out.println("hehe");
}
}
最后:启动项目,发现url真的被过滤了!