本文已参与「新人创作礼」活动,一起开启掘金创作之路。
简单理解什么是过滤取:
我们去景点旅游,到了景点门口需要买票,检票员如果发现你没有买票不让你到里边去,此时检票员就是过滤器
使用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);
}
}