1. 程式人生 > >JavaWeb 自動登入和退出(圖解程式碼執行流程)

JavaWeb 自動登入和退出(圖解程式碼執行流程)

自動登入

主要通過cookie和session的使用,實現自動登入

第一次登入執行流程

使用者第一次登入的時候,只要勾選自動登入功能,我們就生成一個cookie,並將使用者名稱和密碼儲存到cookie中存放到使用者的瀏覽器中
這裡寫圖片描述

生成cookie的程式碼:

// 判斷使用者是不是想自動登入
            String auto = request.getParameter("auto");
            if ("ok".equalsIgnoreCase(auto)) {
                // 說明使用者想自動登入
                Cookie cookie = new
Cookie("autoLogin", userFind.getUsername() + "&" + userFind.getPassword()); // 設定cookie的存活時間和繫結路徑 cookie.setMaxAge(360000); cookie.setPath(request.getContextPath()); // 在響應中新增cookie,並返回給瀏覽器 response.addCookie(cookie); }

第二次登入執行流程

有了使用者的cookie後,我們就可以到cookie中讀取使用者的賬號和密碼,進行自動登入,但是登入成功後將使用者名稱和密碼放到session中,否則每次使用者點選我們的頁面中的連結時,我們都需要到資料庫查詢判斷,影響效率
這裡寫圖片描述

AutoLoginFilter程式碼


import java.io.IOException;
import java.sql.SQLException;

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.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.itheima.domain.User; import com.itheima.service.UserService; import com.itheima.service.impl.UserServiceImpl; public class AutoLoginFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override /** * 處理過濾資訊方法 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; Object object = req.getSession().getAttribute("user"); // 如果從session中獲取user為空,我們才需要獲取cookie進行登陸以及存放到session中,否則直接放行 if (object == null) { // 獲取請求攜帶的cookies Cookie[] cookies = req.getCookies(); Cookie cookie = null; // 先要判斷獲取的cookies是否存在,不然遍歷的時候會報空指標異常 if (cookies != null && cookies.length > 0) { // 遍歷cookies for (Cookie c : cookies) { String name = c.getName(); if ("autoLogin".equals(name)) { // 說明cookie中存在自動登入資訊 cookie = c; break; } } } try { // 說明存在自動登陸的cookie if (cookie != null) { // 我們需要把cookie的值讀取出來存放到session中 String[] split = cookie.getValue().split("&"); User user = new User(); user.setUsername(split[0]); user.setPassword(split[1]); // 呼叫service層登陸 UserService service = new UserServiceImpl(); User userBack = service.login(user); if (userBack != null) {// 說明登陸成功 req.getSession().setAttribute("user", userBack); } } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 如果不存在直接 放行 chain.doFilter(req, resp); // 過濾響應 } @Override public void destroy() { } }

退出

退出的主要思路就是把session中和cookie中使用者資訊幹掉

public void loginOut(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 幹掉cookie和session
        HttpSession session = request.getSession();
        session.removeAttribute("user");

        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                if ("autoLogin".equals(c.getName())) {
                    //設定cookie存活時間為0
                    c.setMaxAge(0);
                    //將cookie響應到前臺
                    response.addCookie(c);
                    break;
                }
            }
        }
        // 重定向到首頁
        response.sendRedirect(request.getContextPath() + "/index.html");
    }