1. 程式人生 > >Servlet入門(六)Cookie的使用與實踐

Servlet入門(六)Cookie的使用與實踐

前言

      本章學習Cookie的相關知識

方法

1.概念

我們知道,一個http請求可能附帶使用者自己的引數,如使用者名稱或者密碼等等。如果需要多個請求共享同一資料的話,那麼就需要Cookie進行儲存已達到目的,典型的就是三天免登陸的例子

2.方法

1)首先建立Cookie物件

Cookie cookie = new Cookie("鍵","值");

Cookie cookie = new Cookie("jwang","haoren");

2)在響應中新增Cookie

response.addCookie(cookie);

經過上面兩步之後,我們的瀏覽器在訪問這個應用的時候會自動的帶上這個cookie

 3)設定cookie的有效時間

上面我們設定的cookie是儲存在瀏覽器記憶體之中,也就是說,我們關閉瀏覽器之後,cookie就會失效。但是有些時候我們需要單獨的給cookie設定一個有效期,以保證它在一定時間內不會因為關閉瀏覽器的原因而失效!

//設定cookie的有效時間,單位秒(s) 
cookie.setMaxAge(1*24*60*60);

這樣的話,即使瀏覽器關閉之後,再次開啟執行該應用的請求,仍然帶有該cookie

4)設定cookie的有效路徑

我們知道,設定了cookie之後,我們對於專案的每一次請求,都會帶有該cookie的資料。有些時候我們不需要這樣做,只是指定的請求路徑下才帶有該cookie,那麼就要設定cookie的有效路徑。

//設定cookie的有效路徑,訪問該路徑請求才帶上cookie
cookie.setPath("/ss");

5)獲取cookie

上面都是介紹的cookie的基本設定,接下來我們來看一下cookie的獲取

cookie儲存於我們的請求之中,自然通過request物件進行獲取

Cookie [] cookies = request.getCookies();
for (Cookie ck: cookies) {
    String name = ck.getName();
    String value = ck.getValue();
    System.out.println("name="+name+",value="+value);
}

注意:該處需要新增cookies非空的判斷,否則可能會出現空指標異常!

實戰——三天免登陸功能的實現

我們仍然以之前的程式碼為例,也就是SMS系統

1.設定使用者名稱cookie,當用戶登入成功之後,新增三天有效期的使用者名稱cookie

//設定為期三天的cookie,其中儲存了使用者名稱的資訊
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(3*24*60*60);
response.addCookie(cookie);
request.getRequestDispatcher("/success.jsp").forward(request, response);

注意:當用戶成功登入是新增該cookie

2.獲取cookie,如果獲取到了指定的cookie,那麼直接跳轉至登入成功頁面success.jsp

完整程式碼如下:

package com.jwang.student.servlet;

import com.jwang.student.bo.User;
import com.jwang.student.service.UserService;
import com.jwang.student.service.impl.UserServiceImpl;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/login.do")
public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response){
        try {
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie ck : cookies) {
                    if ("username".equals(ck.getName())) {
                        request.getRequestDispatcher("/success.jsp").forward(request, response);
                        return;
                    }
                }
            }
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            request.setCharacterEncoding("UTF-8");
            UserService userService = new UserServiceImpl();
            User user = new User("01", username, password);
            if (userService.login(user)) {
                //設定為期三天的cookie,其中儲存了使用者名稱的資訊
                Cookie cookie = new Cookie("username", username);
                cookie.setMaxAge(3 * 24 * 60 * 60);
                response.addCookie(cookie);
                request.getRequestDispatcher("/success.jsp").forward(request, response);
            } else {
                request.getRequestDispatcher("/login.jsp").forward(request, response);
            }
        }catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response){
        this.doGet(request, response);
    }

}

通過以上方法,設定我們的登入系統的路徑為login.do即可實現該功能