1. 程式人生 > >Java-使用Cookie實現登陸會話保持與登出功能

Java-使用Cookie實現登陸會話保持與登出功能

首先先簡單的解釋一下為什麼用Cookie不用Session(當然Session也是可以使用的)
舉個簡單的例子:我盧老爺今天輸入使用者名稱密碼登入了某網站,在網站中隨意切換網站內部的頁面都沒問題,結果一不小心把瀏覽器關了(或者長時間沒有操作),當想再次進行訪問那個網站的時候提示我要重新登陸,這就是Session的機制。
又比如:我開哥今天輸入賬號密碼又登陸了某網站,逛了半天不想逛了,關掉瀏覽器第二天再開啟的時候就直接打開了,這個時候用到的機制就是Cookie。

接下來說說會話保持,會話保持這東西其實很容易理解,舉個栗子:你在某寶上登陸了你的賬號,當你逛的正開心的時候不小心點了右上角,結果你再次進入那個頁面的時候又提示你登陸,這就很是腦闊疼,雖然問題是小問題,但是總這樣就有點頭皮發麻了,畢竟時間很寶貴,登陸一次不要個一分鐘也要個十幾二十秒,一次二十秒,那十次呢?一百次呢?(咳咳…) 一天就在登陸中結束了,想想都可怕,這時候就需要”會話保持“來拯救你了~
重點

大概瞭解了會話保持只會再說說登出(其實我覺得沒必要,畢竟大家不是傻子),登出就是退出登入,當我們用Cookie實現了會話保持功能以後,登出的時候要把Cookie一起消除掉~ 不然你的登出根本沒啥意義(除非你的登出按鈕只是想看看登入頁面是啥樣的?)

在前面的部落格裡已經實現了登陸功能,今天我們就來利用Cookie實現一個簡單的會話保持與登出功能!
首先看看普通的登入方法(真的是普通的不能再普通…)


@RequestMapping("login")
public String login(User user, Model model, HttpSession session, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
    String loginname = user.getLoginname();
    String password = user.getPassword();
    if (loginname!=null||password!=null){
        Map<String, Object> map = loginService.login(loginname, password);
    if (map.get("status").equals("200")) {
        return "system/index.jsp";
    } else {
        model.addAttribute("error", map.get("msg"));
        return "login.jsp";
    }
    }else {
        model.addAttribute("error","請輸入賬號密碼");
        return "login.jsp";
    }

}

這是一個最簡單的登陸方法,也不用細說。實現會話保持的關鍵就是你要在登陸成功後把你的使用者資訊(也可以叫Token)存進Cookie,因為Cookie和Session不一樣,Session是把你的資訊存進伺服器,當你關閉了瀏覽器後它就沒了,而且貌似session的保持時間只有三十分鐘就會過期,而Cookie是存進瀏覽器,當你設定了所以這裡我選擇Cookie,既然不用實現什麼複雜的功能,比如購物車什麼的,只是一個簡簡單單的會話保持,所以也用不上Redis什麼的也不用存進資料庫。
只需要像我這樣在登陸成功的時候建立一個Cookie並且在這個Cookie中存入對應的資訊,然後新增Cookie響應回去就OK啦~

  @RequestMapping("login")
    public String login(User user, Model model, HttpSession session, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
        String loginname = user.getLoginname();
        String password = user.getPassword();
        Cookie cookie1 = new Cookie("loginname",loginname);
//        Cookie cookie1 = new Cookie("name", URLEncoder.encode("哈哈", "UTF-8"));//存中文資訊的時候需要這樣設定編碼
        if (loginname!=null||password!=null){
            Map<String, Object> map = loginService.login(loginname, password);
        if (map.get("status").equals("200")) {
            cookie1.setMaxAge(60*60);//這裡設定設定有效時間,單位的秒,我這裡是一小時
            cookie1.setPath("/");//這裡是之根目錄下所有的目錄都可以共享Cookie
            response.addCookie(cookie1);//新增Cookie
            return "system/index.jsp";
        } else {
            model.addAttribute("error", map.get("msg"));
            return "login.jsp";
        }
        }else {
            model.addAttribute("error","請輸入賬號密碼");
            return "login.jsp";
        }

然後在你的攔截器裡做一些判斷就行~

package com.sixmai.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    //之前執行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
      Cookie[] cookies = request.getCookies();//這裡是取出Cookie
        if ((cookies!=null)){//判斷Cookie是否為空
            for (Cookie cookie : cookies){//遍歷Cookie判斷有沒有對應的name
                if (cookie.getName().equals("loginname")){//有就直接return true
                      return true;
                }
            }
        }
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

到這裡,會話保持基本完成了,接下來就是登出,很簡單,當你點選登出的時候清除Cookie並跳轉到登陸頁面就行拉~

   @RequestMapping("logout")
    public String logout(HttpSession session,HttpServletRequest request,HttpServletResponse response){
//        session.removeAttribute("loginname"); 消耗session

        Cookie[] cookies = request.getCookies();
        for (Cookie cookie :cookies){//遍歷所有Cookie
            if(cookie.getName().equals("loginname")){//找到對應的cookie
                cookie.setMaxAge(0);//Cookie並不能根本意義上刪除,只需要這樣設定為0即可
                cookie.setPath("/");//很關鍵,設定成跟寫入cookies一樣的,全路徑共享Cookie
                response.addCookie(cookie);//重新響應
                return "login.jsp";
            }
        }
        return "login.jsp";
    }

這樣寫了以後當你點選登出就可以直接“清除”Cookie並且跳轉到登陸頁面啦!

The end!!!