cookie原理:
用戶通過瀏覽器向myweb網站發送請求申請OneServlet,OneServlet在運行期間創建了一個cookie存儲當前用戶相關數據。OneServlet工作完畢後,將cookie寫入到響應頭交還給瀏覽器,瀏覽器收到響應包之後,將cookie存在瀏覽器的緩存中。
用戶通過同一個瀏覽器再次向myweb網站發送請求申請TwoServlet時,瀏覽器需要無條件的將myweb網站之前推送過來的cookie寫入到請求頭髮送過去。
cookie構造:
cookie(String key,String value)
實現流程圖:
Java代碼
//配置文件
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>com.luna.controller.OneServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>TwoServlet</servlet-name>
<servlet-class>com.luna.controller.TwoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TwoServlet</servlet-name>
<url-pattern>/two</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
首先是用戶申請會員卡的頁面,用戶將userName和money寫入,通過表單提交給OneServlet
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>會員申請</title>
</head>
<body>
<center>
<font style="font-size: 40px;color: red">會員卡申請</font><br><br>
<form action="/myweb/one">
用戶名:<input type="text" name="userName"><br><br>
預存金額:<input type="text" name="money"><br><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</center>
</body>
</html>
OneServlet拿到用戶提交的參數後存入cookie,並將cookie寫入響應頭信息返回給瀏覽器,瀏覽器攜帶cookie重定向至第二個頁面——用戶點餐頁面index2.html
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、調用請求對象讀取請求頭參數信息
String userName=request.getParameter("userName");
String money=request.getParameter("money");
//2、開卡
Cookie card=new Cookie("userName",userName);
Cookie card1=new Cookie("money",money);
//3、髮卡
response.addCookie(card);
response.addCookie(card1);
//4、通知瀏覽器將點餐頁面寫入到響應體交給瀏覽器
response.sendRedirect("/myweb/index2.html");
}
}
以下是index2.html點餐頁面…
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<center>
<font style="font-size: 40px;color: red">歡迎點餐</font>
<form action="/myweb/two">
<input type="radio" name="food" value="dumpling"> 餃子15元<br><br>
<input type="radio" name="food" value="noodle">麪條12元<br><br>
<input type="radio" name="food" value="rice">米飯13元<br><br>
<input type="submit" value="劃卡消費">
</form>
</center>
</body>
</html>
TwoServlet通過請求對象拿到cookie,對cookie中的值做消費處理。之後建立新的cookie,將計算後的值存入cookie寫入響應頭信息中並返回給瀏覽器,在界面上展現給用戶。也就是說,Servlet拿到了舊cookie(消費之前的money)的值,將其修改(消費之後的money)存入新的cookie再放入響應頭信息返回給瀏覽器。
public class TwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int dumpling_money=15;
int noodle_money=12;
int rice_money=13;
String userName=null;
int money;
int spend=0;
int balance=0;
response.setContentType("text/html;charSet=UTF-8");
PrintWriter out=response.getWriter();
Cookie newCard=null;
//1、讀取請求頭參數信息 得到用戶點餐類型
String food=request.getParameter("food");
//2、讀取cookie
Cookie[] cookies=request.getCookies();
//3、刷卡消費
for(Cookie ele:cookies){
String key=ele.getName();
String value=ele.getValue();
if ("userName".equals(key)){
userName=value;
}else if("money".equals(key)){
money=Integer.valueOf(value);
if ("dumpling".equals(food)){
if(money>dumpling_money){
spend=dumpling_money;
balance=money-spend;
newCard=new Cookie("money",balance+"");
}else{
out.print("用戶"+userName+"餘額不足,請充值");
}
}else if("noodle".equals(food)){
if(money>noodle_money){
spend=noodle_money;
balance=money-spend;
newCard=new Cookie("money",balance+"");
}else{
out.print("用戶"+userName+"餘額不足,請充值");
}
}else if("rice_money".equals(food)){
if(money>rice_money){
spend=rice_money;
balance=money-spend;
newCard=new Cookie("money",balance+"");
}else{
out.print("用戶"+userName+"餘額不足,請充值");
}
}
}
}
//4、將用戶會員卡返回給用戶
response.addCookie(newCard);
//5、將消費記錄寫入到響應
out.print("用戶"+userName+"消費了:"+spend+"元,餘額:"+balance+"元");
}
}
注意:
1、cookie使用前提:兩個servlet來自於同一個網站,並且爲同一個瀏覽器/用戶提供服務,此時藉助於cookie進行數據共享。
2、一個cookie只能存放一個鍵值對
3、cookie中的key與value都只能是String類型
4、cookie中的key不能是中文