Cookie Session详解

一.cookie

上摘抄前言:在了解这三个概念之前我们先要了解HTTP是无状态的Web服务器,什么是无状态呢?就像上面夏洛特烦恼中经典的一幕对话一样,一次对话完成后下一次对话完全不知道上一次对话发生了什么。如果在Web服务器中只是用来管理静态文件还好说,对方是谁并不重要,把文件从磁盘中读取出来发出去即可。但是随着网络的不断发展,比如电商中的购物车只有记住了用户的身份才能够执行接下来的一系列动作。所以此时就需要我们无状态的服务器记住一些事情。

那么Web服务器是如何记住一些事情呢?既然Web服务器记不住东西,那么我们就在外部想办法记住,相当于服务器给每个客户端都贴上了一个小纸条。上面记录了服务器给我们返回的一些信息。然后服务器看到这张小纸条就知道我们是谁了。

1、Cookie实现原理:

  1. 浏览器你去第一次访问服务端时,服务器此时肯定不知道他的身份,所以会创建一个独特的身份标识数据,格式为key=value,放到Set-Cookie字段里,随着响应报文发给浏览器。
  2. 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动将此key=value放入到Cookie字段中发给服务器。
  3. 服务端大吼道请求报文后,发现cookie字段中有值,就能根据此值识别用的身份,然后提供个性化的服务。

接下来我们来演示一下:

我们用servlet进行演示,这样搭建项目方便简单,下面演示时只提供主要代码,其他的省略

@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
省略get()方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Cookie c = new Cookie("msg","helloWorld");
		response.addCookie(c);
	}
}

  项目启动后输入访问路径http://localhost:8080/Demo2/CookieDemo1,然后查看发送的请求。下面是我们首次访问服务器时发送的请求,服务器返回的响应中有Set-Cookie字段。而里面的key=value值正是我们服务器中设置的值。

接下来我们再次刷新这个页面可以看到请求体中已经设置了Cookie字段,并且将我们的值也带过去了。这样服务器就能根据cookie中的值记住我们的信息了。

我们换一个请求,cookie字段还是会被带过去 因为浏览器没有关闭,cookie还是存在的

 

 2.cookie中的细节

 (1)一次可以发送多个cookie,创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即 可

(2)cookie在浏览器中保存多长时间?

       默认情况下,cookie存在在浏览器内存中,当浏览器关闭后,Cookie数据被销毁。

      先访问cookieDemo1,再访问cookieDemo2,可以输出cookie对象 但关闭浏览器之后,再次访问cookieDemo2,cookie对象将无 法访问。

    持久化存储:setMaxAge(int seconds)

   参数:正数:将Cookie数据写到硬盘的文件中,持久化存储,并指定cookie 存活时间,时间到后,cookie文件自动失效。 负 数:默认情况 零:删除cookie信息

@WebServlet("/cookieDemo4")
public class CookieDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
//1.创建Cookie对象
Cookie c1 = new Cookie("msg","setMaxAge");
//2.设置cookie的存活时间
c1.setMaxAge(30); //将cookie持久化到硬盘,30秒后会自动删除cookie文件
//30秒内去访问cookie,还是可以获取的
c1.setMaxAge(-1);
c1.setMaxAge(300);
c1.setMaxAge(0); //删除Cookie
//3.发送Cookie
response.addCookie(c1); //cookieDemo2是获取cookie对象的
}

 3.Cookie中的参数设置

说到这里,应该知道了Cookie就是服务器委托浏览器存储在客户端里的一些数据,而这些数据通常都会记录用户的关键识别信息。所以Cookie需要用一些其他的手段用来保护,防止外泄或者窃取,这些手段就是Cookie的属性。

参数名作用后端设置方法
Max-Age设置cookie的过期时间,单位为秒cookie.setMaxAge(10)
Domain指定了Cookie所属的域名cookie.setDomain("")
Path指定了Cookie所属的路径cookie.setPath("");
HttpOnly告诉浏览器此Cookie只能靠浏览器Http协议传输,禁止其他方式访问cookie.setHttpOnly(true)
Secure告诉浏览器此Cookie只能在Https安全协议中传输,如果是Http则禁止传输

cookie.setSecure(true)

 

(1)setPath()方法

      默认情况下cookie不能共享

      在cookie对象中,有一个setPath(String path)方法,用来设置cookie的获取范围。默认 情况下,当前的虚拟目录为参数。因此 多个项目之间,cookie对象不能共享。

     如果要共享,则可以将参数设置为"/"。表示在当前服务器的根路径下面,因此所有项目 都可以访问共享该cookie。

     在Demo2项目下:访问CookieDemo1 在Demo3项目下,新建一个CookieDemo2,此时是不能获取cookieDemo1中的对象的。

     如果在Demo2项目下,在CookieDemo1中,加上一句c1.setpath("/"); 此时在Demo3项目下就能获取了

不同的tomcat服务器间cookie共享问题?setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享 例如:setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以 共享

(2)setDomain(String path)

setDomain(String path):如果设置二级域名相同,那么多个服务器之间cookie可以共享 例如:setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以 共享

4.Cookie的特点和作用

cookie数据存储在客户端浏览器 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限 制(20个) 作用:cookie一般用于存储少量的不太敏感的数据,在不登录的情况下,完成服务器对客户 端的身份识别。【例如:浏览器的一些设置信息,在不登录的情况下,被存储在cookie中,存在浏览器 内部,下次访问浏览器时直接使用

二.session

Cookie是存储在客户端方,Session是存储在服务端方,客户端只存储SessionId

session用来存储一些重要的信息,如果将账户的一些信息都存入Cookie中的话,一旦信息被拦截,那么我们所有的账户信息都会丢失掉。所以就出现了Session,在一次会话中将重要信息保存在Session中,浏览器只记录SessionId一个SessionId对应一次会话请求。

1.实现原理

session其实是依赖cookie实现的

@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
省略get()方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session =request.getSession();
		session.setAttribute("TestSession","HelloWorld");
	}

}
       
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
省略get()方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session =request.getSession();
		session.getAttribute("TestSession");
	}

}
       

在浏览器输入http://localhost:8080/Demo2/CookieDemo1进行访问可以看到在服务器的返回头中在cookie中生成了一个SessionId。

再次访问浏览器带着cookie中存在的JSESSIONID,然后就能根据此Id找到存储在服务端的信息了。

2.Session细节

(1)当客户端关闭后,服务器不关闭,两次获取的session是否为同一个?

      默认情况下不是

      如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存

//当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
		HttpSession session = request.getSession();
		System.out.println(session);
		Cookie c = new Cookie("JSESSIONID",session.getId());
		c.setMaxAge(60*60*5);//设置cookie存活时间  关闭浏览器后  再次访问是同一个session
		response.addCookie(c);

(2)客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

例如:商品在购物车对象中,购物车对象在session对象中,如果商品结算之前,购物网站服务器重启了,session对象不是同一个,商品对象发生丢失。

不是同一个session对象,但是确保数据不会丢失,tomcat自动完成以下工作。

session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上-----------存储到硬盘的文件上

session的活化:在服务器启动后,将session文件转化为内存中的session对象即可。

具体步骤:钝化时打开eclipse的工作区间

里面有我们部署上去的项目,把项目改成war包,然后放到tomcat的工作区间去,webapps文件夹下,之后
启动本地的tomact,然后访问一下,再正常关闭本地的tomcat,,将session对象序列化到硬盘上 ---- 存储到硬盘的文件上

接下来开始活化     在服务器启动后,此时SESSION.ser就不在文件夹中了,session文件转化为内存中的session对象即可 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值