JavaWeb丨通過過濾器實現登入攔截及處理中文亂碼問題
阿新 • • 發佈:2018-12-02
“登入過濾器”就是為了防止在使用者沒有登入的情況下來訪問我們的網站。
過濾器的生命週期一般都要經過下面三個階段:
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");