一、什么是Filter過濾器
二、 為什么要用Filter過濾器
場景: 防止用戶未登錄就隨意訪問了網站內部
在實際場景中,我們在開發完成后,為了保證網站的安全性,只有登錄后才能訪問某些網站內部的頁面,如果不進行一層登錄的過濾,那么任何人都能通過URL來隨意的訪問到網站內部的頁面,這是不合理的。例如此刻的我網站內部一個頁面URL是
http://localhost:8080/sis/public/page/main.html
但是我想讓只有登錄過的人才能合法的訪問到這個頁面,此時使用Filter過濾器就能解決這個問題。實現邏輯是通過Session信息判斷是否登錄了,如果未登錄就重定向到登錄的首頁。
其他:通過對JSP、Servlet、靜態圖片文件、或靜態HTML文件進行攔截,以實現URL級別的權限控制、過慮敏感詞匯、壓縮響應信息等一些高級功能。
三、如何使用 1. 重寫過濾器的三個方法
public class QuickFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("qucikFilterRunning");
//放行請求
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
三個方法都是可以表現 Filter 生命周期的方法,其中 init() 方法在 Web 應用程序加載時會被調用,destroy() 方法在 Web 應用程序卸載(或關閉)時被調用,這兩個方法都只會被調用一次,而 () 方法會被調用多次(只要客戶端有請求時就會被調用),Filter 所有的工作集中在 () 方法中。
2.使用案例
防止未登錄用戶訪問到網站內部頁面,未登錄的情況下訪問,會進行一個重定向跳轉到登錄頁面。而請求后端非登錄接口,不允許訪問,一律設置為401
@WebFilter("/*")//模糊匹配 所以的路徑都會過濾
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
/** 只要是匹配到了路徑,①都先執行doFilter ,②再去執行Servlet*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
String uri = req.getServletPath();
// 校驗:①前端html攔截 ②非前端的就是后臺接口,除了登錄接口之外
HttpSession session = req.getSession(false);//沒有session時候 返回null
if (session == null) { //沒有登錄
//首頁重定向到登錄頁面
if ( "/public/page/main.html".equals(uri) ) {
res.setContentType("text/html;charset= UTF-8");
//開始重定向
String schema = req.getScheme();//HTTP
String host = req.getServerName();//服務器ip
int port = req.getServerPort();//端口號
String ctx = req.getContextPath();//項目部署路徑 應用上下文 sis
// 錯誤寫法①res.sendRedirect("/public/page/main.html");②res.sendRedirect("public/page/main.html");

String basePath = schema+"://"+host+":"+port+ctx;
res.sendRedirect(basePath+"/public/index.html");//正確寫法
return;
//請求后端非登錄接口, 未登錄不允許訪間的請求,一般返回401狀態碼
}else if ( (!uri.startsWith("/public/")
&& !uri.startsWith("/static/") && !"/user/login".equals(uri))) {
res.setContentType("application/json");
PrintWriter pw = res.getWriter();
Response r = new Response();
r.setCode("ERR401");
r.setMessage("不允許訪問");
res.setStatus(401);//設置響應的狀態碼
pw.println(JSONUtil.write(r)); //響應打到前端
pw.flush();
return;
}
}
filterChain.doFilter( servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
*請認真填寫需求信息,我們會在24小時內與您取得聯系。