cookie会话技术

J2EE中的Cookie会话技术
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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值