前言
過濾器是Javaweb非常基礎的一個概念,屬于Servlet的一部分余佃。本文記錄一下在SpringBoot項目中是如何使用Filter過濾器。
一跨算、過濾器是什么爆土?
過濾器是AOP(面向切面編程)思想的具體實現≈畈希可以過濾瀏覽器發(fā)出的請求步势,并且決定放行請求還是中斷請求。
機制簡述:
在瀏覽器對服務器發(fā)起請求或者服務器對瀏覽器響應背犯,都會經過過濾器坏瘩。
基于過濾器的機制,我們可以在過濾器中對請求和響應做一些處理漠魏,可以在過濾器中決定是否放行倔矾,例如:校驗請求中有沒有敏感字符串,校驗有沒有Session蛉幸,實現URL級別的權限控制破讨、壓縮響應信息丛晦、編碼格式等。
二提陶、過濾器的實現
1.使用@WebFilter注解
Filter的執(zhí)行由Servlet容器回調完成烫沙,因此我們不需要再額外引包。
下面列舉一個登錄場景:即用戶需登錄后才能訪問
新建MyFilter類
@Slf4j
@Order(1)
@WebFilter(filterName = "myFilter", urlPatterns = {"/user/*"})
public class MyFilter implements Filter {
@Autowired
private SysUserService sysUserService;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("過濾器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("請求處理");
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
log.info("MyFilter, URL:{}", request.getRequestURI());
if (request.getRequestURI().contains("login")) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
log.info("非法URL:{}", request.getRequestURI());
response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
PrintWriter writer = response.getWriter();
writer.print("no access");
}
}
@Override
public void destroy() {
log.info("過濾器銷毀");
}
}
2.啟動類注解
用@WebFilter注解隙笆,指定攔截路徑以及一些參數锌蓄,同時需要在啟動類使用@ServletComponentScan掃描帶@WebFilter、@WebServlet撑柔、@WebListener并將幫我們注入bean
@ServletComponentScan
@SpringBootApplication
public class DevRootApplication {
public static void main(String[] args) {
SpringApplication.run(DevRootApplication.class, args);
}
}
3.測試
輸入請求:http://localhost:8080/hello/error1
沒有攔截請求瘸爽,因為我們設置的攔截請求為 /user/*,帶user的請求才會被攔截處理铅忿。
輸入請求:http://localhost:8080/user/getUserByCondition
日志:
過濾器使用成功剪决。這里只是簡單演示,實際的登錄處理大部分情況通過token配合過濾器來實現檀训。
補充:設置多個過濾器的執(zhí)行順序
當你有多個過濾器之后柑潦,就需要規(guī)定各個過濾器的指定順序了。
使用@Order()注解
以上就是SpringBoot中過濾器的簡單使用峻凫。
? 上一章:SpringBoot —— 簡單整合Redis實例及StringRedisTemplate與RedisTemplate對比和選擇
? 下一章:SpringBoot —— 簡單多模塊構建
創(chuàng)作不易渗鬼,關注、點贊就是對作者最大的鼓勵荧琼,歡迎在下方評論留言
求關注譬胎,定期分享Java知識,一起學習命锄,共同成長堰乔。