Session与Cookie详解
1. 什么是会话 会话的目的
1.1会话:客户端向浏览器发送一个连接请求开始,客户端明确会话结束或者服务器在预设的一段时间内没有收到连接请求会话结束
1.2会话技术的目的:http是一个无连接的协议,但在会话过程中想要保存在会话过程中生成的一些信息。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
2.session技术的原理及实现
2.1 session原理
当浏览器发送第一次发送请求的时候,服务器收到请求会自动生成一个sesion id,并开辟一个session域,并会响应浏览器,以cookie的方式写入到浏览器中。当再次发送请求时,浏览器会把这个会把这个sessio id 发送给servlet,servlet根据session id找到相应的session域,在这个session域中取出数据。
抓包查看
第一次请求sessionservlet(内容为httpsession session = request.getsession();)
第二次请求sessionservlet(内容为httpsession session = request.getsession();)
请求sessonsevlet2(servlet的内容空白只做测试用,因为是在同路径下,依然带有session)
----------------------------------------------------------------------------------------------------------------------------
2.2session的实现
建立
httpsession session = request.getsession();//如果这次请求有对应的session就返回那个session,没有的话就新建一个session,并将session发送给客户端
存储信息(与其他域对象一样的三个函数)
session.setattribute(string name,object obj); session.setattribute(string name,object obj); session.setattribute(string name,object obj);
session的生命周期
创建
1.第一次执行request.getsession()时创建
销毁
1.session过期/失效(默认30分钟):是从最后一次操作结束时计时
web.xml中的 <session-config> <session-timeout>10</session-timeout> </session-config> 可以设置单前工程的session的持久化时间 也可以在server.xml修改相关的信息,设置全局的session持久化时间
2.调用session.invadate()
3.服务器关闭时
注意:浏览器关闭,session就销毁,这句话是不正确的
虽然浏览器关闭之后,再次与相同的地址建立请求,会新建一个session,但是并不代表是服务器端的session被销毁了。原因是session id是以cookie的形式在浏览器中存储了,cookie的默认存在时间是一次会话的范围,浏览器一旦关闭cookie信息就被清除了,所以在发送链接请求的时候就不会发送对应的session id了。如果想解决上述问题就可以设置cookie的持久化,代码如下:
cookie cookie = new cookie("jsessionid",session.getid()); cookie.setpath("/29-cookie-seesion");//设置cookie的路径范围,只有在请求相同路径内的资源时候,才会发送对应的cookie cookie.setmaxage(60*2); response.addcookie(cookie);
---------------------------------------------------------------------------------------------------------------------------------------------
3.cookie技术
有了前面session的铺垫,cookie就比较好理解了
3.1建立cookie
cookie cookie = new cookie(string cookiename,string cookievalue);//新建cookie cookie.setmaxage(int seconds);//设置cookie的持久化时间,如果设置了cookie的持久化时间,cookie就会被存储在磁盘里,注意要写在add之前 cookie.setpath("/29-cookie-seesion");//设置cookie的路径范围,只有在请求相同路径内的资源时候,才会发送对应的cookie response.addcookie(cookie);//会以响应形式发送给浏览器
3.2删除cookie
新建一个同名cookie,将持久化时间设置为0即可
3.3获取浏览器端的 cookie
cookie[] cookies = request.getcookies(); if(cookies != null) { //取出每一个cookies for (cookie cookie : cookies) { //判断名字是否是自己的 string name = cookie.getname(); if(name.equals("lk")) { response.getwriter().write("lk = value"+cookie.getvalue()); } }