Java 三大器之過濾器Filter
過濾器是用來過濾web請求的,比如有一個網站域名開啟的是首頁,如果登陸的使用者可以點選首頁的去檢視個人資訊啥的,但是沒有登陸的使用者是沒有個人資訊的,也無權訪問這些頁面。所有可以使用過濾器來過濾這些非法未登陸的url, 在重定向,就是沒登陸的使用者訪問個人資訊會強制自動跳轉到登陸頁面。而登陸成功的使用者可以正常訪問。
過濾器完全在後臺編寫,前端什麼都不需要參與,過濾器Filter和前端的cookies類似,不過這是完全在後臺的,爭對的個體單位是ip, 同一個ip,登陸了,退出登陸,退出瀏覽器重新進入session依然存在(預設設定),依然可以在未登陸情況下訪問個人資訊。
程式碼:
建立 一個實現 javax.servlet.Filter 介面的類
package io.bbc13.controller; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * * @Lin * @過濾首頁(+其他頁面)未登陸的情況 * @重定向到登陸頁面 * */ public class LoginFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request; HttpServletResponse httpResponse = (HttpServletResponse)response; HttpSession session= httpRequest.getSession(); if(session.getAttribute("username") != null) { System.out.println("通過session獲取到的username=" + session.getAttribute("username") + "不為空:"); chain.doFilter(request, response); } else { // 重定向到登陸頁面 System.out.println("controller.LoginFilter 未登入進入指定頁面,現在跳轉到登陸頁面"); // testLogin.html是需要被重定向到的登陸頁面 httpResponse.sendRedirect(httpRequest.getContextPath() + "/testLogin.html"); } } public void init(FilterConfig fConfig) throws ServletException { } }
對於只需過濾一個頁面的簡單過濾器,我們只需關注doFilter(..)函式。
FilterChain chain 是過濾鏈,比如說對於同一個url,如果寫了多個filter,這些filter就會形成一個過濾鏈,層次過濾。
先將request, response轉化為HttpServlet..
session是在HttpServletRequest物件中獲取的,新建session只能通過 HttpServletRequest物件.getSession(boolean arg)獲取。
session.getAttribute("username") 這是獲取從session中存的key為"username"的值value
session.setAttribute("username", "test") 可以加入設定key-value到session。 這句就放在登陸成功的servlet裡面,登陸成功就設定這句,那麼登陸的使用者開啟請求個人資訊的url時session就有值了,證明已經登陸。沒有登陸的,也就沒有執行登陸成功的servlet裡面的這句,所已”username“的值是空的,會被過濾器重定向。
// 以下兩句寫在登陸的servlet裡(要寫在正確登陸後)
// 資訊正確,可以登陸...
HttpSession session = request.getSession();
session.setAttribute("username", "test");
同時要配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>bobo</display-name>
<!-- 註冊過濾器 -->
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>io.bbc13.controller.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/testSign.html</url-pattern>
</filter-mapping>
<!-- 註冊監聽器 -->
<!-- 註冊servlet -->
</web-app>
過濾器要放在監聽器前面(字母f排在l前面)
配置和servlet類似,<url-pattern>表示的是要被過濾的頁面,這裡是簽到測試頁面,表示只有登陸了才能簽到。