1.会话定义就是用户从打开浏览器访问某个网站,访问这个网站的多个web资源,直到关闭浏览器称之为一次会话。
2.Cookie(小甜饼)是一种客户端技术,服务器把每个用户的数据以cookie的形式返回给浏览器做存储,当用户使用浏览器再次访问
服务器的web资源时就会带着各自的数据访问服务器,这样web服务器处理的就是用户各自的数据了。
3.J2EE中cookie是在哪产生?如何存储的呢?其生命周期又是怎么样的呢?
①cookie是如何产生的呢?
cookie是在服务器中产生的,由httpservletresponse对象响应给客户端的。
代码如下:
package com.yd.servlet;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.ServletException;
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;
/**
* Servlet implementation class CreateCookie
* 这个servlet类是用来创建cookie的
*/
@WebServlet("/CreateCookie")
public class CreateCookie extends HttpServlet {
private static final long serialVersionUID = 1L;
public CreateCookie() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应对象的编码集
response.setContentType("text/html;charset=utf-8");
//创建一个Cookie对象
//这里报错 Control character in cookie value or attribute. 意思是控制字符在cookie的属性或者值中
//这里报错主要是因为cookie中不能存储中文 解决方法是对存储值进行编码 取出时做解码即可
Cookie cookie=new Cookie("name", URLEncoder.encode("你好啊cookie", "utf-8"));
Cookie cookie2=new Cookie("pwd", URLEncoder.encode("你好啊cookie", "utf-8"));
//通过response对象响应给客户端 并且由浏览器自动做存储
response.addCookie(cookie);
response.addCookie(cookie2);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
服务器响应cookie(可以是多个)给浏览器,浏览器接受cookie并作存储如图:
首先可以看出cookie其实就是一个键值对相当于map(只是其key和value都是字符串类型的)一样,其次可以
看出在存储cookie时浏览器记录了cookie是属于哪个web资源下的,这里的web资源就是/CookieTest
这里需要注意cookie中是不能存储中文的。通常的解决方案很简单就是对中文进行编码存储,当读取的时候在进行解码即可。
还有一点很重要的是,如果存储的cookie的键名已经存在,在往里面存储相同键名的数据就会覆盖原来键名所对应的值。
②如何获得cookie呢?
因为我们浏览器在存储cookie值的时候记录了cookie是属于那个web资源下的,所以在请求该web资源时浏览器默认会将其web资源下的
和web资源隶属的web服务器的cookie封装到http协议中发送给服务器。服务器再把这些cookie值封装到HttpServletRequest对象中。
如图浏览器发送cookie给服务器:
具体是如何获得cookie的代码如下:
package com.yd.servlet;
import java.io.IOException;
import java.net.URLDecoder;
import javax.servlet.ServletException;
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;
/**
* Servlet implementation class ReadCookie
*/
@WebServlet("/ReadCookie")
public class ReadCookie extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ReadCookie() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求对象的编码集
request.setCharacterEncoding("utf-8");
//获得所有的cookie
Cookie[] cookies=request.getCookies();
for(int i=0;i<cookies.length;i++){
Cookie cookie=cookies[i];
System.out.println("Cookie的key:"+cookie.getName()+"\tvalue:"+ URLDecoder.decode(cookie.getValue(), "utf-8") );
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
执行结果:Cookie的key:pwd value:你好啊cookie //这个是web资源下
Cookie的key:name value:你好啊cookie //这个是web资源下的
Cookie的key:Hm_lvt_dbdd94468cf0ef47148d2 value:1479779474 //这个是web资源隶属的web服务器下的被所有web服务器下的资源共享
Cookie的key:History value:27,13,40.0,http://localhost:8080/ihome326/upload/c1f4a021-c51d-4c39-88dd-010530825728.png#
③cookie的生命周期是如何的呢?
如果默认情况下如:
Cookie cookie=new Cookie("name", URLEncoder.encode("你好啊cookie", "utf-8"));
Cookie cookie2=new Cookie("pwd", URLEncoder.encode("你好啊cookie", "utf-8"));
//通过response对象响应给客户端 并且由浏览器自动做存储
response.addCookie(cookie);
response.addCookie(cookie2);
cookie则是会话级别的,也就是当浏览器关闭时,cookie就会自动销毁。如果通过setMaxAge(秒数)来设置cookie的生命周期有分三种情况:
①如果秒数为0,那么就是要删除该cookie值
package com.yd.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
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;
/**
* Servlet implementation class DeleteCookie
*/
@WebServlet("/DeleteCookie")
public class DeleteCookie extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DeleteCookie() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//获得所有的cookie
Cookie[] cookies=request.getCookies();
if(cookies!=null&&cookies.length>0){
for(Cookie cookie:cookies){
String name=cookie.getName();
if ("name".equals(name)) {
System.out.println("进来了");
cookie.setMaxAge(0);
response.addCookie(cookie); //将cookie添加到响应对象中 才能通知浏览器要删除该cookie
}
}
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
在没有执行该servlet类时cookie如下图
进行设置生命周期为0后键名为name的cookie被删除,如下图:
②如果为负数,则代表cookie是会话级别的,和没有设置的时候默认情况是一样的。
③如果为正数,cookie的生命周期就为设置的描述。
4.cookie小结:
①cookie是产生于服务器端
②保存在客户端
③cookie可以设置生命周期通过setMaxAge(),如果默认不设置那么该cookie的在浏览器关闭时自动销毁。参数是负数也是为会话界别的
浏览器关闭cookie自动销毁。如果设置为0那么就是要删除该cookie。如果是正数那么参数就是其生命周期的秒数。
④cookie其实就是一个键值对,如果存储相同健名的cookie原来的value就会被覆盖
⑤cookie是不能存储中文的解决办法是进行编码,取出的时候进行解码即可。
⑥cookie存储是明文存储的,所以一般存储是是需要加密的
⑦一个浏览器客户端只能存储300个cookie,每个web资源只能存储20个cookie,而且大小也是有限制的,不能超过4KB。