要了解session和cookie是什么,先要了解如下几个概念。javascript
协议:是指计算机通讯网络中两台计算机之间进行通讯所必须共同遵照的规定或规则。html
超文本传输协议(HTTP):是一种通讯协议,它容许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。前端
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的链接就会关闭,再次交换数据须要创建新的链接。这就意味着服务器没法从链接上跟踪会话。java
会话:指用户登陆网站后的一系列动做,好比浏览商品添加到购物车并购买。会话(Session)跟踪是Web程序中经常使用的技术,用来跟踪用户的整个会话。经常使用的会话跟踪技术是Session与Cookie。Session经过在服务器端记录信息肯定用户身份,Cookie经过在客户端记录信息肯定用户身份。web
因为HTTP是一种无状态的协议,服务器单从网络链接上无从知道客户身份。用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经没法判断该购买行为是属于用户A的会话仍是用户B的会话了。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,不管谁访问都必须携带本身通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie 的工做原理。跨域
Cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。浏览器
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还能够根据须要修改Cookie的内容。安全
1.2.1 会话Cookie和持久Cookie 若不设置过时时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie通常不存储在硬盘上而是保存在内存里,固然这种行为并非规范规定的。服务器
若设置了过时时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过时时间。存储在硬盘上的cookie能够在浏览器的不一样进程间共享。这种称为持久Cookie。cookie
就是说,浏览器访问百度不会带上谷歌的cookie
Session是另外一种记录客户状态的机制,不一样的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session。客户端浏览器再次访问时只须要从该Session中查找该客户的状态就能够了。每一个用户访问服务器都会创建一个session并自动分配一个SessionId,用于标识用户的惟一身份。
1)如何在每次请求时都把SessionId自动带到服务器呢?
那就是cookie了,若是你想为用户创建一次会话,能够在用户受权成功时返回一个惟一的cookie。当一个用户再次发起请求时,浏览器会将用户的SessionId自动附加在HTTP头信息中(这是浏览器的自动功能,用户不会察觉到,开发人员也不需操做),当服务器处理完这个请求后,将结果返回给 SessionId 所对应的用户。
2)储存须要的信息。
服务器经过SessionId做为key,读写对应的value,这就达到了保持会话信息的目的。
当程序须要为某个客户端的请求建立一个session时,服务器首先检查这个客户端的请求里是否已包含了sessionId,若是已包含则说明之前已经为此客户端建立过session,服务器就按照sessionId把这个session检索出来使用(检索不到,会新建一个),若是客户端请求不包含sessionId,则为此客户端建立一个session而且生成一个与此session相关
联的sessionId,sessionId的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionId将被在本次响应中返回给客户端保存。
若是客户端禁用了cookie,一般有两种方法实现session而不依赖cookie。
1)URL重写。就是把sessionId直接附加在URL路径的后面。
2)表单隐藏域。服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时可以把sessionId传回服务器。
好比:
<form name="walking-form" action="/xxx/xxx">
<input type="hidden" name="JSessionId" value="NaOw3vjFW75aKnsF2C2HmdnV9LZcEbzWoWiBdHnLerjQ99zmpQng!-142002807">
<input type="text">
</form>
复制代码
四、Session共享 对于多网站(同一父域不一样子域)单服务器,咱们须要解决的就是来自不一样网站之间SessionId的共享。因为域名不一样(aaa.walking.com 和 bbb.walking.com),而SessionId又分别储存在各自的cookie中,所以服务器会认为对于两个子站的访问,是来自不一样的会话。解决的方法是经过修改cookies的域名为父域名达到cookie共享的目的,从而实现SessionId的共享(非服务器集群session共享)。带来的弊端就是,子站间的cookie信息也同时被共享了。
登陆网站,今输入用户名密码登陆了,次日再打开不少状况下就直接打开了。这个时候用到的一个机制就是cookie。 session一个场景是购物车,添加了商品以后客户端处能够知道添加了哪些商品,而服务器端如何判别呢,因此也须要存储一些信息就用到了session。
在Java Web开发中,Session为咱们提供了不少方便,Session是由浏览器和服务器之间维护的。在传统的java web开发,咱们经过实现 javax.servlet.Servlet 接口或继承 javax.servlet.http.HttpServlet 来实现客户端和服务端以Http协议交互。
对Session的操做以下:
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession session = request.getSession();
session.setAttribute("userName","walking");//设置属性
session.setMaxInactiveInterval(30*60);//过时时间 单位秒
session.getCreationTime();//获取session的建立时间
session.getLastAccessedTime();//获取上次与服务器交互时间
String id = session.getId();//获取sessionId
int timeout = session.getMaxInactiveInterval();//获取session过时时间
session.invalidate();//销毁session
}
复制代码
客户端与服务端对用户信息的维持有一个时间限制,因为客户端长时间(休眠时间)没有与服务器交互,该session被认为已过时,服务器将此Session销毁,客户端再一次与服务器交互时以前的Session就不存在了。这就是session的过时。
一、在web.xml中设置session-config
以下:
<session-config>
<session-timeout>2</session-timeout>
</session-config>
复制代码
即,客户端连续两次与服务器交互间隔时间最长为2分钟,2分钟后session.getAttribute()获取的值为空。原来的session已被销毁,重新的session里获取以前设置的属性值天然就为空了。
二、在Tomcat的/conf/web.xml中
session-config,默认值为:30分钟
<session-config>
<session-timeout>30</session-timeout>
</session-config>
复制代码
三、在Servlet中设置
HttpSession session = request.getSession();
session.setMaxInactiveInterval(60);//单位为秒
复制代码
1.优先级:Servlet中API设置 > 程序/web.xml设置 > Tomcat/conf/web.xml设置
2.若访问服务器session超时(本次访问与上次访问时间间隔大于session最大的不活动的间隔时间)了,即上次会话结束,但服务器与客户端会产生一个新的会话,以前的session里的属性值所有丢失,产生新的sesssionId
3.客户端与服务器一次有效会话(session没有超时),每次访问sessionId相同,若代码中设置了session.setMaxInactiveInterval()值,那么这个session的最大不活动间隔时间将被修改,并被应用为新值。
4.Session的销毁(表明会话周期的结束):在某个请求周期内调用了Session.invalidate()方法,此请求周期结束后,session被销毁;或者是session超时后自动销毁;或者客户端关掉浏览器
5.对于JSP,若是指定了<%@ page session="false"%>,则在JSP中没法直接访问内置的session变量,同时也不会主动建立session,由于此时JSP未自动执行request.getSession()操做获取session。
前面说过,客户端每次请求服务器会把cookie信息放到header头信息中,咱们能够经过 HttpServletRequest.getCookies()方法获取全部cookie对象,经过 HttpServletResponse 对象的addCookie方法向客户端返回cookie。
具体操做API以下:
Cookie[] cookies = request.getCookies();//request对象获取全部cookie
for (Cookie cookie : cookies) {
String name = cookie.getName();//cookie name
String value = cookie.getValue();//cookie value
String domain = cookie.getDomain();//域名
int maxAge = cookie.getMaxAge();//过时时间
boolean secure = cookie.getSecure();//浏览器经过安全协议发送cookies 返回true
String comment = cookie.getComment();//描述
int version = cookie.getVersion();//版本
//以上除name属性都有对应set方法
boolean httpOnly = cookie.isHttpOnly();//是否Httponly
cookie.setHttpOnly(true);//设置Httponly值
}
//new cookie对象
Cookie cookie = new Cookie("userName","walking");
cookie.setPath("/");
cookie.setMaxAge(60*30);//30分钟
response.addCookie(cookie);//回写给客户端浏览器
复制代码
前端建立设置cookie
/** * 建立并设置cookie * @param name cookie名称 * @param value cookie值 * @param expires 过时时间 毫秒 不填则默认30分 */
function Setcookie(name, value, expires) {
//设置名称为name,值为value的Cookie
expires = expires || 30* 60 * 1000;
var expdate = new Date(); //初始化时间
expdate.setTime(expdate.getTime() + expires); //时间
//即document.cookie= name+"="+value+";path=/"; 时间能够不要,但路径(path)必需要填写,
// 由于JS的默认路径是当前页,若是不填,此cookie只在当前页面生效!~
document.cookie = name + "=" + value + ";expires=" + expdate.toGMTString() + ";path=/";
}
复制代码
前端获取cookie属性值
/** * 获取对应cookie属性的value * @param c_name cookie属性name * @returns {string} cookie value */
function getCookie(c_name) {
if (document.cookie.length > 0) {
c_start = document.cookie.indexOf(c_name + "=");
if (c_start != -1) {
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) c_end = document.cookie.length;
return unescape(document.cookie.substring(c_start, c_end));
}
}
return "";
}
复制代码
一、cookie数据存放在客户的浏览器上,session数据放在服务器上。
二、cookie不是很安全,别人能够分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
三、session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
四、单个cookie保存的数据不能超过4K,不少浏览器都限制一个站点最多保存20个cookie。
五、能够考虑将登陆信息等重要信息存放为session,其余信息若是须要保留,能够放在cookie中。
六、在程序开发过程当中,咱们能够在客户端每次与服务器交互时检查SessionID(Session中属性值,非HttpServlet环境开发中也能够用其它的Key值代替),用于会话管理。