1. 程式人生 > 其它 >【JavaWeb 實際專案_Cookie&Session 06】

【JavaWeb 實際專案_Cookie&Session 06】

一、什麼是Cookie

cookie是伺服器通知客戶端儲存鍵值對的一種技術

客戶端有了cookie以後,每次請求都發送給伺服器

每個cookie的大小都不能超過4kb

二、如何建立Cookie

1、建立cookie-session的JavaWeb專案-->com.wufq.servelt包-->CookieServlet類、BaseServlet類(匯入book已有的)

2、修改web.xml的請求路徑

 <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <
servlet-class>com.wufq.servlet.CookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieServlet</servlet-name> <url-pattern>/cookieServlet</url-pattern> </servlet-mapping>

3、修改cookie.html的請求地址

<title
>Cookie</title> <base href="http://localhost:8080/cookie_session/"> <style type="text/css"> ul li { list-style: none; } </style> </head> <body> <iframe name="target" width="500" height="500" style="float: left;"></iframe> <div
style="float: left;"> <ul> <li><a href="cookieServlet?action=createCookie" target="target">Cookie的建立</a></li> <li><a href="" target="target">Cookie的獲取</a></li> <li><a href="" target="target">Cookie值的修改</a></li> <li>Cookie的存活週期</li>

4、CookieServlet類建立createCookie方法(實現cookie物件的實現)

public class CookieServlet extends BaseServlet{

    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1、建立cookie物件
        Cookie cookie = new Cookie("key1", "value1");
        //2、通知客戶端儲存cookie
        resp.addCookie(cookie);
        
        resp.getWriter().write("Cookie建立成功!");
    }

5、啟動程式以後,測試發現:存在兩個問題:

1)顯示到瀏覽器上面的中文出現亂碼

2) cookie可以一次建立多個cookie,並且一定要用response.addCookie(cookie)通知客戶端,否則客戶端接收不到cookie資訊

解決這兩個問題的方法:

第一個問題的解決方法:在BaseServlet的doPost請求內加上

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        //解決post請求中文亂碼問題
        //一定要在獲取請求引數呼叫之前執行才有效
        req.setCharacterEncoding("UTF-8");
        //解決響應中文的亂碼問題
        resp.setContentType("text/html;charset=UTF-8");

        try {
//          //通過反射獲取login,regist方法
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            //呼叫方法
            method.invoke(this,req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

第二個問題實現的方式:

在CookieServlet類內多建立幾個Cookie物件

        Cookie cookie2 = new Cookie("key2", "value2");
        resp.addCookie(cookie2);
        
        Cookie cookie3 = new Cookie("key3", "value3");
        resp.addCookie(cookie3);

驗證:響應頭Set-cookie儲存cookie的鍵值對

三、cookie的獲取

1、伺服器獲取客戶端的Cookie只需要一行程式碼:req.getCookie():Cookie[]

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        for(Cookie cookie : cookies) {
            /*
            *
             * cookie.getName() 獲取cookie的key
             * cookie.getValue() 獲取cookie的value
            \*/
            resp.getWriter().write("Cookie[ "+cookie.getName()+":"+cookie.getValue()+" ]"+"</br>");
        }
        Cookie iWantCookie = CookieUtil.findCookie("key2",cookies);
        
        if (iWantCookie != null) {
            resp.getWriter().write("找到了需要cookie");
        }
    }

除了去獲取全部的cookie,在實際專案中還常用cookie的key去查詢對應的值==>這種通用的方法一般會寫成工具類

cookieUtil類

public class CookieUtil {

    public static Cookie findCookie(String name,Cookie[] cookies){
        if(name == null||cookies==null||cookies.length == 0){
            return null;
        }
        for(Cookie cookie : cookies) {
            if (cookie.getName().equals(name)) {
                return cookie;
            }
        }
        return null;
    }
}