Session
1.Session的生命周期
Session的生命周期(同一浏览器,无论是否关闭,都使用同一个session会话,直达session被销毁)
注意:
(1)浏览器关闭session是不会销毁的
(2)同一浏览器多个用户共用一个session(session存活时)
同一浏览器,登录两个用户,使用session获取用户信息,第二个用户会把第一个用户的信息覆盖掉
(3)默认的Tomcat是支持Session持久化的,即重启Tomcat Session仍然存在!!!!!
使Tomcat重启Session失效,修改Tomcat $TOMCAT_HOME$/conf/context.xml 文件解除下面注释
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
1.1 session什么时候创建:
Session一般存储在服务器的内存中,Sessinon在用户访问第一次访问服务器时创建(注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session)。当然,强制生成Session可使用request.getSession(true)方法。
注意事项:
1 客户端第一次发送请求java服务器时,是不会产生JSESSIONID的
2 当客户端第一次向服务端请求session的时候,服务端通过调用request.getSession()的时候才会创建session,并且这个时候会在response的cookie中写入JSESSIONID=session.getId() 之后这台浏览器发送的请求时候都会带上这个cookie . 这样浏览器和服务器之间通过cookie中的JSESSIONID就产生了关联
3 当客户端第一次向服务端请求jsp的时候也会产生session
JSP默认自动创建session:<%@ page session="true"%>
1.2 session什么时候销毁:
1.session的持有者(即客户端浏览器)在最大无活动等待时间(MaxInactiveInterval)内无任何响应或请求 ;
设置方法有许多(这里随便写两种):
1.session.setMaxInactiveInterval(2 * 3600); // Session保存两小时
2.web.xml里有:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
2.调用Session的invalidate方法强制销毁。
3.jsp服务器重起或发生中断(这个和tomcat服务器的配置有关(默认不销毁,可以设置全部销毁),重启默认前会把session写入文件里保存,重启后会读取session文件,所以session默认时间没过还是存在的)
注意:关闭浏览器并不会销毁session,默认下次开启浏览器会新建session,但是旧的session会在最大无活动等待时间后自动执行销毁。(文章后面教如何实现一直使用同一个session)
1.3 Session怎么识别用户(服务器怎么识别/区分用户):
Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。
具体:当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set-Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服务器),或Set-Cookie JSESSIONID=nj1tvkclp3jh83olcn3191sjq3(java服务器)信息,此信息是服务器随机生成的,放在服务器内存里,为了标识唯一的客户端用户,内容不会重复,这就是sessionid.该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
怎么实现关闭浏览器,再打开浏览器时候使用原来的session:
或者关闭浏览器,再打开浏览器还是登陆的状态:
或者重新打开浏览器没有新建session:
或者使用Cookie实现短时间内不用重新登陆(当然后台也没有自动登陆,和自动登陆有区别):
方法:因为保存Sessionid的cookie是临时的(浏览器关闭就会销毁),所以我们自己手动创建一个持久化的cookie,用来保存sessionid;
//以下是持久化cookie,保存sessionid,实现关闭浏览器,重新打开还是使用原来的session
session.setMaxInactiveInterval(2 * 3600); // Session保存两小时
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(2 * 3600); // 客户端的JSESSIONID也保存两小时
cookie.setPath("/");
response.addCookie(cookie);
(注意,第一次访问时候遍历cookie只有一个cookie,刷新第二次访问遍历却有两个cookie,我想:第一次访问自动生成的临时cookie还没有返回给浏览器,第一次访问结束了,浏览器才有了临时的cookie,和我们手动持久化的cookie,所以第二次访问遍历获取了两个cookie,都有相同的sessionid属性。关闭浏览器,再访问,遍历只有一个cookie,因为临时的cookie关闭浏览器时候销毁了,
现在只使用持久化的cookie了,里面有sessionid属性)
1.4 如果Cookie功能禁用,我们怎么识别用户?
Java Web提供了另一种解决方案:URL地址重写。
URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。
注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。
2.Session细节:
1> 服务器让浏览器记住sessionID的cookie 默认过期时间是 (-1)
=> 关闭浏览器 cookie就丢失 ==> cookie丢失 sessionID就丢失 ==> 找不到服务器的session
2> session中除了 4个操作 map的方法之外,还有哪些方法.
long getCreationTime() 获得创建时间
String getId() 获得sessionID
long getLastAccessedTime() 获得最后一次访问时间
int getMaxInactiveInterval() 获得session的寿命
void setMaxInactiveInterval(int interval) 设置session的过期时间
void invalidate() 让session立即失效
boolean isNew()
3> 关于设置session的最大有效时间
默认是30分钟. ==> 在tomcat的web.xml中 <session-config> 配置的.
如何修改session的过期时间?
1.修改在tomcat的web.xml中 <session-config> ==> 影响服务器中的所有项目
2.在项目的web.xml中 加入<session-config> 配置.==> 影响的是当前项目
3.通过setMaxInactiveInterval(int interval)方法设置.==> 当前操作的session
4>(了解内容)URL重写
如果浏览器 禁用cookie功能不能保存任何cookie.那么session技术要是用 cookie来保存sessionID. 没有cookie怎么保存?
使用url重写解决该问题.
将页面中所有的连接 末尾全都加上 cookieid的参数. 这样用户点击连接访问网站,通过url把SeesionID带到了服务器.这样就解决了.
但是 互联网行业没有这么干的.
Cookie
1.Cookie使用:
//1.添加cookie到浏览器
//新建一个cookie(键值对)
Cookie cookie = new Cookie("name", "tom");
//将cookie 添加到响应中
response.addCookie(cookie);
//2.浏览器发送cookie到服务器,如何取
//获得所有浏览器发送的cookie
Cookie[] cookies = request.getCookies();
//遍历并判断我们要找的cookie
if(cookies!=null && cookies.length>0){
for(Cookie c : cookies){
if(c.getName().equals("name")){
System.out.println("获得的cookie:"+c.getName()+":"+c.getValue());
}
}
}
cookie原理.
让浏览器记住键值对.是向响应头中添加一下头即可:
set-Cookie:name=tom;
浏览器记住之后,向服务器发送键值对,是在请求头中添加下面的信息:
Cookie: name=tom;
2.cookie细节问题:
1.浏览器记住键值对
让浏览器记住键值对.是向响应头中添加一下头即可:
set-Cookie:name=tom;
浏览器记住之后,向服务器发送键值对,是在请求头中添加下面的信息:
Cookie: name=tom;
2.有效时间如何设置?
//设置cookie的最大有效时间
1>设置一个正数,标示最大有效时间.单位是秒
//cookie.setMaxAge(60*60);
2>设置为-1 , 就是相当于默认有效时间, 浏览器关闭就消失.
//cookie.setMaxAge(-1);
3> 标示cookie的有效时间为0.发送到浏览器就消失了.
//利用有效时间为0 这件事,我们可以做删除cookie的操作.
// 因为同一个路径 ,不能存在相同的cookie(键相同).
// 我们可以通过覆盖的方式,设置有效时间为0. 删除cookie
cookie.setMaxAge(0);
3.浏览器在什么情况下发送cookie(路径)
cookie的默认路径就是发送cookie的servlet所在目录.
/Day09-cookie
/Day09-cookie/abc/xxxServlet
访问路径如果是cookie路径的子路径那么,浏览器就会把该cookie告诉服务器.
4.cookie中的域
Cookie的作用在于充当一个信息载体在Server端和Browser端进行信息传递,而Cookie一般是以域名为分割的,例如a.xxx.com与b.xxx.com的Cookie是不能互相访问的,但是子域名是可以访问上级域名的Cookie的。即a.xxx.com和b.xxx.com是可以访问xxx.com下的Cookie的
想要以下三个 主机和主机下的项目能共享一个cookie.
www.baidu.com
music.baidu.com
map.baidu.com
完成两步即可:
1.设置cookie的域为 ".baidu.com"
2.设置cookie路径 为: "/"
以上就是跨主机访问cookie.不常用.