【JavaWeb 實際專案_Cookie&Session 06】
阿新 • • 發佈:2021-08-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> <divstyle="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; } }