1. 程式人生 > >Java 三大器之過濾器Filter

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>表示的是要被過濾的頁面,這裡是簽到測試頁面,表示只有登陸了才能簽到。