1. 程式人生 > >二十 Filter&自動登錄功能

二十 Filter&自動登錄功能

none 校驗 部署 關閉瀏覽器 utf 是否 cookie -s ace

Filter過濾器

過濾器,其實就是對客戶端發出來的請求進行過濾,瀏覽器發出,然後服務器用Servelt處理。在中間就可以過濾,起到的是攔截的作用。

不僅僅作用於客戶端請求,而且過濾服務器響應

作用:

  • 對一些敏感詞匯進行過濾
  • 統一設置編碼
  • 自動登錄

如何使用Filter?

  1. 新建一個類,實現Filter接口
  2. 註冊過濾器,在web.xml中配置filter,url建議為/*
  3. chain.doFilter(request, response);//是否連接下一個過濾器,也就是說,過濾器3是否放行,讓後續過濾器執行攔截功能
  4. init方法的參數FilterConfig可用於獲取filter在註冊的名字以及初始化參數(在web.xml配置),這裏的功能設計的初衷與ServletConfig是一樣的
  5. 如果想放行,在doFilter方法裏面操作,讓請求到達下一個目標
  6. url-pattern寫法格式:
    • 全路徑匹配 /LoginServlet
    • 目錄匹配 (/目錄開始 , /* 結束) /jsp/*
    • 以後綴名匹配,以*開始,以後綴名結束 *.jsp *.html等
    • 針對dispatch設置:<dispatcher></dispatcher>
            • REQUEST 只要請求過來都攔截,默認是REQUEST
            • FORWARD 只要是轉發都攔截
            • ERROR 頁面出錯跳轉
            • INCLUDE 包含頁面則攔截

Filter的生命周期:

創建:部署到服務器,則初始化,創建

銷毀:服務器停止則銷毀

Filter的執行順序:

  1. 客戶端發送請求,先經過過濾器,如果過濾器放行,那麽才到Servlet。不僅僅作用域客戶端請求,而且過濾服務器響應
  2. 如果有多個過濾器,那麽他們會按照註冊的映射順序來

Filter實現自動登錄功能:

  • 1.獲取信息
  • 2.校驗失敗,原頁面
  • 3.校驗成功,跳轉index.jsp
    • 1存儲賬號密碼到cookie
    • 2發送Cookie給客戶端
    • 3使用Session存起來儲用戶信息,session在關閉服務器或者超過默認時間才銷毀
  • 4.過濾器:
    • 獲取Cookie
    • 沒有Cookie則表明沒有登錄,放行。
    • 有Cookie,找出曾經放的用戶名和密碼,執行登錄的操作。
    • 使用Session存起來這個用戶值,放行。

一、Servlet校驗登錄信息,保存Cookie

思路:

  1. 拿到用戶名和密碼進行校驗,失敗則重新返回登錄頁面
  2. 校驗成功則用session存儲用戶信息跳轉到首頁,並判斷是否勾選了自動登錄
  3. 如果勾選了自動登錄,那麽將用戶名和密碼封裝成Bean添加到Cookie保存,後續用於過濾器實現自動登錄功能
public class LoginServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
        try {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String autologin = request.getParameter("autologin");//on
            System.out.println(username+":"+password+":"+autologin);
            //校驗用戶名密碼
            UserBean user = new UserBean();
            user.setUsername(username);
            user.setPassword(password);
            UserDao dao = new UserDaoImpl();
            UserBean userBean = dao.Login(user);
            if(userBean!=null){
                //頁面提交上來的時候是否選擇了自動登錄
                if("on".equals(autologin)){
                    Cookie cookie = new Cookie("auto_login", username+"#"+password ); 
                    cookie.setMaxAge(60*60*24*7);//7天有效期
                    cookie.setPath(request.getContextPath());//應用名字
                    response.addCookie(cookie);
                }
                //成功了,進入首頁
                request.getSession().setAttribute("userBean", userBean);
                response.sendRedirect("index.jsp");
            }else{
                //登錄失敗
                request.getRequestDispatcher("login.jsp").forward(request, response);
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

二、過濾器實現自動登錄功能:

思路:

  1. 先判斷本次請求中session是否有效,如果有效,則放行
  2. 如果session失效,則拿到cookie判斷是否第一次登錄
  3. cookie是空,第一次登錄,放行,讓用戶先登錄,登錄時Servlet會添加Cookie保存此次登錄的信息
  4. 如果cookie不為空,不是第一次登錄,那麽拿到cookie中的值,封裝成Bean對象,保存到session中,方便下次未過期之前還能用
  5. 如果出現異常,也放行,防止用戶頁面空白

public class AutoLoginFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        try {        
            HttpServletRequest request = (HttpServletRequest) req;
            //先判斷session中是否還有userBean,如果有,當前會話還是有效的
            UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
            if(userBean!=null){
                //如果session有效,放行,此時頁面有session信息,登錄成功顯示歡迎您,${userBean.username }
                chain.doFilter(request, response);
            }else{
                //此時session失效,比如說關閉瀏覽器,第二次打開,此時看Cookie
                //1 取出Cookie,
                Cookie[] cookies = request.getCookies();
                //2 找出需要的cookie
                Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");
                if(cookie==null){
                    //表明第一次登錄,放行
                    chain.doFilter(request, response);
                }else{
                    //表明不是第一次,取出Cookie中的值,完成登錄
                    String value = cookie.getValue();
                    String username = value.split("#")[0];
                    String password = value.split("#")[1];
                    System.out.println(username+":"+password);
                    UserBean user = new UserBean();
                    user.setUsername(username);
                    user.setPassword(password);
                    UserDao dao = new UserDaoImpl();
                    userBean = dao.Login(user);
                    
                    //使用Session存一下這個值,方便下一次未過期前還可以用
                    request.getSession().setAttribute("userBean", userBean);
                    
                    chain.doFilter(request, response);
                }
            }    
        } catch (Exception e) {
            e.printStackTrace();
            //出現異常,也放行
            chain.doFilter(req, response);
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
       System.out.println("Filter初始化了");
    }

}

三、登錄成功頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
這是首頁,
<c:if test="${not empty userBean }">
歡迎您,${userBean.username }
</c:if>
<c:if test="${ empty userBean }">
您好,請登錄!
</c:if>

</body>
</html>

技術分享圖片

一、

二十 Filter&自動登錄功能