从零开始学习Java Web(六):session和cookie

来源:互联网 发布:白芨吉利知胃病中草药 编辑:程序博客网 时间:2024/05/22 00:48

我们或许都对session和cookie有一些多多少少的概念,知道session是用来标识同一个用户的,cookie是客户端用来保存键值对的参数。一个会话过程就是session的一个生命周期,当session过期了,会话结束。
那么,怎么理解session和cookie呢,它们之间有什么联系。
首先,我们来看看session是什么时候产生的,当我们调用下面的代码时,服务器会产生一个session。

HttpSession session = request.getSession();

当执行该方法时,假如session已经存在,则获取已存在的session,当然我们比较关心的是当session不存在时,服务器做什么操作呢?
首先,服务器会生成一个不重复的字符串JSESSIONID,初始化一个session对象,并将JSESSIONID和这个session对象绑定起来,最后响应给客户端时,会附带Set-Cookie:JSESSIONID=xxxxxxx的header回去,告诉客户端保存这个cookie,该cookie的键是JSESSIONID,值是xxxxxx。当客户端再次发起请求的时候,会带上这个cookie,服务端就会拿到JSESSIONID的值,去查找相应的session对象。这样,服务器就能知道带有相同JSESSIONID的请求是同一个用户发出的。

session就好比我们的身份证号码,我的身份证对应的就是我,而不是别人。

那么,我怎么知道session是刚创建的,还是原有的?或者说我只想拿到原有的session,如果原来没有,那我就不往下操作,这时候该怎么实现?
我们可以调用session.isNew()判断session是否是新建的,可以调用request.getSession(false)来拿到原有的session,如果session没有存在,则返回null。其实request.getSession(true)等同于request.getSession();

我们常听别人说,cookie保存在客户端(浏览器),session保存在服务器。但是,却很少人告诉我们,服务端session的获取要依赖保存于客户端的JSESSIONID去识别。如果客户端禁用cookie,那么服务器一般情况下都得不到JSESSIONID,调用HttpSession session = request.getSession()只会拿到新创建的session,每次请求都新创建一个会话。

那么,禁用cookie的情况下如何保持同一个会话呢?
这里有一个办法,就是采用URL重写技术,通过调用response.encodeURL(url)或者response.encodeRedirectURL(url),这两个方法会返回一个字符串,将”;jsessionid=xxxxx”拼接到url的后面,这样,服务器就能拿到jsessionid,也就能拿到对应的session对象了。

session只有三种死法:
1.超时
2.调用session.invalidate();
3.服务器崩溃或者停止

如何设置超时时间:

<!--在web.xml设置,这里设置的单位是分钟--><session-config>    <session-timeout>15</session-timeout></session-config>//在代码中设置,这里的单位是秒session.setMaxInactiveInterval(15*60);

会话的维持一般不需要我们操作,我们主要使用的是session的两个方法。

session.getAttribute(String);session.setAttribute(String, Object);

例如,我们登录时执行以下代码:

User user=new User("张三");session.setAttribute("user", user);

判断登录时:

User user=(User)session.getAttribute("user");if(user==null){    throw new RuntimeException("您没有登录,无权操作!");}
原创粉丝点击