Javaweb-服务端与客户端的信息识别-Session与Cookie

  • Post author:
  • Post category:java




Javaweb-服务端与客户端的信息识别-Session与Cookie



Cookie概述


什么叫Cookie

Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器


Cookie规范

你大可以放心,Cookie不会占满你的硬盘。因为一个Cookie最多只有4KB,并且浏览器最多可以保存300个Cookie。当然,在浏览器大战的今天,一些浏览器为了打败对手,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!但也不会出现把你硬盘占满的可能!

不同的浏览器之间不能共享Cookie


Cookie的作用

Cookie的作用可大了,但无论怎么夸大Cookie的作用都离不开“跟踪客户端状态”这句话。我们知道Cookie是服务器保存在客户端的信息,然后客户端会在下次请求时把Cookie在还给服务器,这样服务器就可以通过信息来识别客户端了



Cookie快速上手


保存Cookie到客户端

这是响应工作的一部分,所以这个方法是response对象的。并且Cookie是HTTP协议中的内容,所以保存Cookie是HttpServletResponse类的方法


void addCookie(Cookie c)

:添加

Cookie对象

到当前response对象中,这个方法可以被调用多次,从而完成添加多个Cookie对象到response中

public class AServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, 
			HttpServletResponse response)
			throws ServletException, IOException {
		Cookie c = new Cookie("name", "lakesy");
		response.addCookie(c);
	}
}


服务端读取Cookie:

我们现在已经可以保存Cookie到客户端了,但还没有学习让服务器如何读取Cookie。

如果浏览器保存了Cookie,那么会在下一次请求时把Cookie放到请求头中发送给服务器,这时服务器需要在请求中读取Cookie。既然是在请求中读取,那么当然是使用request对象来读取了


HttpServletRequest:Cookie[] getCookies()

注意,它返回的是

Cookie数组

,而不是一个Cookie对象。如果请求中

没有Cookie,那么该方法返回null

		Cookie[] cs = request.getCookies();
		if (cs != null) {
			for (Cookie c : cs) {
				String str = c.getName() + ": " + c.getValue() + "<br/>";
				response.getWriter().print(str);
			}
		}


response.getwriter().print()

是响应给客户端的东西,如果不用ajax接收将数据放在合适的位置,就会在浏览器上生成一个新的页面来显示内容



Cookie的生命周期

Cookie会在客户端存活多久呢?这就是Cookie的生命了。默认情况下,Cookie只在浏览器的内存中存活,也就是说,当你关闭浏览器后,Cookie就会消失

可以使用

Cookie#setMaxAge(int expiry)

来设置Cookie的存活时间。参数expiry表示Cookie存活的秒数


  • cookie.setMaxAge(60*60)

    :表示cookie对象可存活1小时。就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时。因为

    当maxAge大于0时,浏览器不仅会把cookie保存在浏览器内存中,还会把cookie保存到硬盘上


  • cookie.setMaxAge(-1)

    :cookie的maxAge属性的默认值就是-1(其实只要是负数都是一个意思),表示只在浏览器内存中存活,

    一旦关闭浏览器窗口,那么cookie就会消失


  • cookie.setMaxAge(0)

    :cookie被作废!表示cookie即不在内存中存活,也不在硬盘上存活,这样的cookie设置只有一个目的,那就是覆盖客户端原来的这个cookie,使其作废



Session概述

ession也是域对象之一,它的范围是在一个

会话范围

内有效。session既然是域对象,那么当然就要有getAttribute()和setAttribute()系列方法了

在一个会话内共享一个session对象,所以session中可以保存

一个会话内的数据

。例如当前用户的信息

session的

范围大于request

,可以在

一个会话中多个请求之间共享数据

。但session的范围小于

ServletContext(application)

,session

不能在多个用户之间共享数据

目前所学过的域对象的作用范围:

​ ServletContext > HttpSession > HttpServletRequest

使用

request.getSession()

方法就可以获取session对象

有了session,就

不用使用Cookie来跟踪会话

了!但是session不能像Cookie那样长命,一旦用户关闭浏览器窗口,那么session就死掉了



Session原理

我们都知道HTTP是无状态协议,但是为什么session可以跟踪会话状态呢?没错,session依赖Cookie

当客户端第一次访问服务器时,服务器会为客户端创建一个session对象,然后把session对象放到session池中,在响应时把sessionId通过Cookie响应给客户端。注意,只有在第一次访问时,服务器才会创建session,给客户端响应sessionId。从此以后就不会了

当客户端再次访问服务器时,会在请求中带着sessionId给服务器,服务器通过sessionId到session池中找到session对象,这就可以完成会话跟踪了。也就是说,服务器端保存的是session对象,而客户端只有sessionId。每次访问都需要通过客户端的sessionId来匹配服务器端的session对象!这样用户在session中保存的数据就可以再次被使用了


sessionId是服务器通过Cookie发送给客户端浏览器的

,这个Cookie的maxAge为-1,即只在浏览器内存中存在。如果你关闭所有浏览器窗口,那么这个Cookie就会消失了



Session失效

session失效有如下几个原因:


  • session.invalidate()

    方法注销session

  • session超时

<session-config> 
<!-- session的超时时间,以分钟为单位 --> 
<session-timeout>1</session-timeout>
</session-config>
  • Cookie被禁用



版权声明:本文为JunSIrhl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。