1. 程式人生 > >JavaWeb丨通過過濾器實現登入攔截及處理中文亂碼問題

JavaWeb丨通過過濾器實現登入攔截及處理中文亂碼問題

“登入過濾器”就是為了防止在使用者沒有登入的情況下來訪問我們的網站。

過濾器的生命週期一般都要經過下面三個階段:
1.初始化
當容器第一次載入該過濾器時,init() 方法將被呼叫。該類在這個方法中包含了一個指向 Filter Config 物件的引用。
2.過濾
過濾器的大多數時間都消耗在這裡。doFilter方法被容器呼叫,同時傳入分別指向這個請求/響應鏈中的 Servlet Request、Servlet Response 和 Filter Chain 物件的引用。然後過濾器就有機會處理請求,將處理任務傳遞給鏈中的下一個資源(通過呼叫 Filter Chain 物件引用上的 doFilter方法),之後在處理控制權返回該過濾器時處理響應。
3.析構


容器緊跟在垃圾收集之前呼叫 destroy()方法,以便能夠執行任何必需的清理程式碼。

具體程式碼操作如下

1.登入過後,需要把使用者名稱設定為全域性共享

 HttpSession session = request.getSession();	//將資料儲存到session中 
 session.setAttribute("loginName", loginName);
 

2.在web.xml檔案中定義一個登入過濾器,程式碼如下:

    <!-- 配置過濾器 -->
     <filter>
     	<description>
登入過濾器</description> <filter-name>loginFilter</filter-name> //過濾器類名 <filter-class>aiit.ifly.Filter.LoginFilter</filter-class>//包名+過濾器類名 </filter> <!-- 對映過濾器 --> <filter-mapping> <filter-name>loginFilter</filter-
name> //攔截內容,我設定的為攔截所有/* <url-pattern>/*</url-pattern> </filter-mapping>

3.新建一個LoginFilter過濾器類,繼承Filter類。

package aiit.ifly.Filter;

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;

public class LoginFilter implements Filter {
	 
	public void doFilter(ServletRequest resquest, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest hrequest = (HttpServletRequest)resquest;
		HttpServletResponse hresponse = (HttpServletResponse)response;
		//設定統一編碼格式
		hrequest.setCharacterEncoding("utf-8");
		//無需登入過濾就能瀏覽的介面,像登入介面、註冊介面、還有一些儲存圖片的路徑,把它們單抽取出來
				if(hrequest.getServletPath().endsWith("login.jsp")||hrequest.getServletPath().endsWith("toCheckLogin")||hrequest.getServletPath().endsWith(".png")){
			chain.doFilter(resquest,response);
		}else{
		    //獲取登入過後,全域性共享資料
			Object name =hrequest.getSession().getAttribute("loginName");			
			if(name!=null){				
				// 已經登陸,繼續此次請求
				chain.doFilter(resquest, response);
			}else{
				//如果沒有取到使用者資訊,非法訪問,沒有登陸,跳轉到登陸頁面
				hresponse.sendRedirect("login.jsp");//重定向到登入介面
			}			
		}
	}

	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}
 
}

4.退出登入後,要銷燬全域性共享資訊,如不銷燬,瀏覽器會預設記住資訊,短時間內,再次訪問,過濾器無法識別是否登入

	request.getSession().invalidate();

5.過濾器處理中文亂碼問題,在doFilter裡面新增下面這句,就可以解決servlet中文亂問題

	//設定統一編碼格式
		request.setCharacterEncoding("utf-8");