提出问题:
Http 是一种无状态的协议,web 服务器本身不能识别那些请求是同一个浏览器发出的,浏览器每一次请求都是孤立的。
怎么实现购物车呢?某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上-次请求的程序所得到的用户信息。
在 servlet 中,常用以下两种机制完成会话跟踪:
- Cookie
- session
Cookie
- cookie机制采用的是在客户端保持HTTP状态信息的方案
- Cookie是 在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件
- 一旦WEB浏览器保存了某个Cookie ,那么它在以后每次访问该WEB服务器时都会在HTTP请求头中将这个Cookie回传给WEB服务器
- 底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
- 一个Cookie只能标识一种信息,它至少含有-一个标识该信息的名称( NAME )和设置值( VALUE )
- 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
- 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
实现Cookie 登陆
Sigin.jsp
<form action="index.jsp" method="post">
Name:<input type="text" name="name">
<input type="submit" name="submit" value="Submit">
</form>
index.jsp
<body>
<%
//得到登陆名
String name = request.getParameter("name");
//登录名存在且不为空 则创建一个Cookie
if(name != null && !name.trim().equals("")){
//创建一个Cookie name = "name",value = name
Cookie cookie = new Cookie("name",name);
//设置这cookie的存活的最大失效 30秒
cookie.setMaxAge(30);
//回传cookie
response.addCookie(cookie);
}else{
//用户名为空或者 不存在 检查是否有可用的cookie
Cookie[] cookies = request.getCookies();
//当数组不为空且长度大于0 是有cookie
if(cookies != null && cookies.length > 0){
for(Cookie c : cookies){
//得到cookieName
String cookieName = c.getName();
//判断cookie 的名字是不是 “name” 是的话则是一个存好的用户
if("name".equals(cookieName)){
String val = c.getValue();
name = val;
}
}
}
}
//有用户 时 打印信息
if(name != null && !name.trim().equals("")){
out.print("Hello :" + name);
}else{
//没有是回传给sigIn.jsp
response.sendRedirect("SigIn.jsp");
}
%>
</body>
实例二: 书籍信息记录
Books中
<body>
<h4>Books Page</h4>
<a href="book.jsp?book=javaWeb">java Web</a><br><br>
<a href="book.jsp?book=java">java</a><br><br>
<a href="book.jsp?book=Oracle">Oracle</a><br><br>
<a href="book.jsp?book=Ajax">Ajax</a><br><br>
<a href="book.jsp?book=JavaScript">javaScript</a><br><br>
<a href="book.jsp?book=Android">Android</a><br><br>
<a href="book.jsp?book=Jbmp">Jbmp</a><br><br>
<a href="book.jsp?book=Struts">Struts</a><br><br>
<a href="book.jsp?book=Hibrnate">Hibrnate</a><br><br>
<a href="book.jsp?book=Spring">Spring</a><br><br>
<br><br>
<%
Cookie[] cookies = request.getCookies();
//遍历打印 符合条件的cookie
if(cookies != null && cookies.length > 0){
for(Cookie cookie:cookies){
if(cookie.getName().startsWith("A_")){
out.println(cookie.getValue());
}
}
}
%>
</body>
book.jsp
<body>
Book:<%= request.getParameter("book") %>
<br><br>
<a href="Books.jsp">Return...</a>
<%
//得到书名
String name = request.getParameter("book");
//得到所有的cookie
Cookie[] cookies = request.getCookies();
//创建一个临时的 cookie
Cookie tempCookie = null;
//用一个 cookie 的数组保存cookie
List<Cookie> lists = new ArrayList<Cookie>();
//cookie 中有cookie
if(cookies != null && cookies.length > 0){
//遍历cookie
for(Cookie cookie: cookies){
//得到当前 cookie 的名字
String cookieName = cookie.getName();
//判断 cookie 是否 以A_开头 开头则book 的cookie
if(cookieName.startsWith("A_")){
//将 当前cookie 放入 list 数组
lists.add(cookie);
//判断是否有和当前选中的一样的 cookie
if(cookie.getValue().equals(name)){
tempCookie = cookie;
}
}
}
}
//判断 lists 中的cookie 大于五个且 tempCookie 为 Null的话,则删除第一个cookie
if(lists.size() >= 5 && tempCookie == null){
tempCookie = lists.get(0);
}
//若tempCookie 不为空则删除
if(tempCookie != null){
tempCookie.setMaxAge(0);
//回传
response.addCookie(tempCookie);
}
//添加当前 cookie
Cookie cookie = new Cookie("A_"+name,name);
response.addCookie(cookie);
%>
</body>
实现效果:超链接选择,显示最近五条记录
Cookie 常用方法
- 创建一个Cookie
Cookie cookie = new Cookie("cookieName",cookieValue);
- 设置cookie 的最大时效
cookie.setMaxAge(time);
以秒为单位,当time 为0 时删除这个cookie
- 设置 cookie 的作用范围:可以用于当前目录和当前目录的子目录,但不能作用域当前目录的上一级目录
cookie.setPath(request.getContextPath())
4.调用response 把一个cookie 传到客户端
response.addCookie(cookie)
来源:CSDN
作者:即客。
链接:https://blog.csdn.net/qq_39887036/article/details/104338426