SpringBoot配置过滤器

47 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

简单理解什么是过滤取:

我们去景点旅游,到了景点门口需要买票,检票员如果发现你没有买票不让你到里边去,此时检票员就是过滤器

使用Servlet3.0注解开发自定义的过滤器

使用Servlet3.0的注解进⾏配置步骤

  • 启动类里面增加@ServletComponentScan,进⾏扫描新建⼀个Filter类,implements Filter,并实现对应的接⼝
  • @WebFilter标记一个类为filter,被spring进⾏扫描
  • urlPatterns:拦截规则,支持正则,控制chain.doFilter的方法的调用,来实现是否通过放⾏,web应用resp.sendRedirect("/index.html") 或者 返回json字符串

场景:权限控制、用户登录状态控制等

用例

@SpringBootApplication
// 这里要添加这个注解
@ServletComponentScan
public class SpringbootExApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringbootExApplication.class, args);
	}
}
@WebFilter(urlPatterns = "/data/api/getValueAfterFilter", filterName = "testFilter")
public class TestFilter implements Filter {
  private static final ObjectMapper objectMapper = new ObjectMapper();

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("test filter begin...");
  }

  @Override
  public void doFilter(
      ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
      throws IOException, ServletException {
    System.out.println("doFilter LoginFilter======");

    HttpServletRequest req = (HttpServletRequest) servletRequest;
    HttpServletResponse resp = (HttpServletResponse) servletResponse;
    String token = req.getHeader("token");
    if (StringUtils.isEmpty(token)) {
      token = req.getParameter("token");
    }

    if (!StringUtils.isEmpty(token)) {
      filterChain.doFilter(servletRequest, servletResponse);
    } else {
      ResponseData responseData = ResponseData.buildError("", -100);
      String jsonStr = objectMapper.writeValueAsString(responseData);
      renderJson(resp, jsonStr);
    }
  }

  @Override
  public void destroy() {
    System.out.println("test filter end...");
  }

  private void renderJson(HttpServletResponse response, String json) {
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/json");
    try (PrintWriter writer = response.getWriter()) {
      writer.print(json);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
@RestController
@RequestMapping("/data/api")
public class TestController {
  @Autowired
  private TestService testService;

  @RequestMapping("/getValueAfterFilter")
  public ResponseData getValueAfterFilter(String key) {
    String name = TestService.map.get(key);
    return ResponseData.buildSuccess(name);
  }
}