文档章节

JavaWeb 之 Session

o
 osc_494oymqd
发布于 2019/10/04 17:49
字数 2056
阅读 34
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

Session

一、Session 概述

  1、Session 就是一个接口(HttpSession)。

  2、Session技术:服务器端会话技术,它是用来维护一个客户端和服务器之间关联的一种技术。

  3、每个客户端都要一个自己的 Session 会话,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HttpSession)中。

  4、Session 会话中,经常用来保存用户登录之后的信息。

 Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session。

二、Session 的工作原理

  1、Session 的创建

    (1)Session的创建时机是在 request.getSession() 方法第一次被调用时。

    (2)Session被创建后,同时还会有一个名为 JSESSIONID 的 Cookie 被创建。

    (3)这个 Cookie 的默认时效就是当前会话。

  2、Session 的使用

    (1)Session被创建后,对应的Cookie被保存到浏览器中,之后浏览器每次访问项目时都会携带该Cookie。

    (2)当我们再次调用时会根据该JSESSIONID获取已经存在的Cookie,而不是在创建一个新的Cookie。

    (3)如果Cookie中有JSESSIONID,但是JSESSIONID没有对应的Session存在,则会重新创建一个HttpSession对象,并重新设置JSESSIONID。

    

 

二、Session 的使用

  1、创建与获取 Session 

    通过 HttpServletRequest 可以获取 HttpSession 对象

    方法:

HttpSession session = request.getSession();

      注意:当第一次调用该方法,是用于创建 Session 会话;之后再次调用,都是获取前面创建好的 Session 会话对象。

  2、获取 id,判断 session 是否为新建

    每个 Session 都有一个身份证号,就是 ID值,并且这个 ID 是位置的。

    还可以通过 isNew() 方法来判断是不是刚创建出来的 session

    方法:

String getId():   用于获取 session的 id(唯一)
boolean isNew():  用于判断 session 是不是新建的,true 表示是刚创建的,false 表示获取之前就已经创建了

  

  3、Session 域对象的存取数据

    Session 也相当于一个作用域,可以用来存储和获取数据

    方法:

Object getAttribute(String name)  
void setAttribute(String name, Object value)
void removeAttribute(String name)  

  

二、Session 生命周期控制

  基本原则:Session 对象在服务器端不能长期保持,它是有时间限制的,超过一定时间没有被访问过的 Session 对象就应该释放掉,以节约内存。

  两个常用方法:

public void setMaxInactiveInterval(int interval):设置 session的超时时间(以秒为单位)超过指定的时长,session 就会被销毁;
        设置值为正数的时候,设定 session 的超时时长;值为负数或为零表示永不失效 public void invalidate():让当前 session 会话马上超时无效;

  1、Session 的默认的超时时长是多少?

    Session 默认的超时时间长为 30分钟。

    在 Tomcat 服务器的下的 conf目录下的配置文件 web.xml 中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长 30分钟。

    Tomcat 中的配置:

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

  2、如何给web工程设置超时时长?

    在自己的 Web 工程中的 web.xml 配置中可以配置 session 的超时时长,这样就可以修改 web 工程下所有 Session 的默认超时时长。

    超时时长配置:

<!--表示当前 web 工程。 创建出来 的所有 Session 默认是 20 分钟 超时时长-->
<session-config>
  <session-timeout>20</session-timeout>
</session-config>

  3、如何给个别的 session 设置超时?

    如果只想修改个别的 session 的超时时长,就可以使用上面的 setMaxInactiveInterval(int interval) 来进行单独的设置。

session.setMaxInactiveInterval(int interval)单独设置超时时长。

  4、Session 的超时是什么?

    Session 的超时是指,客户端两次请求的最大间隔时长。

    

     Demo:

 1  // session 3秒后超时
 2     protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 3         // 先获取 Session 对象
 4         HttpSession session = req.getSession();
 5         // 设置当前 Session3 秒后超时
 6         session.setMaxInactiveInterval(3);
 7         resp.getWriter().write("当前 Session 已经设置为 3 秒后超时");
 8     }
 9 
10     //Session 马上被超时示例:
11     protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
12         // 先获取 Session 对象
13         HttpSession session = req.getSession();
14         // 让 Session 会话马上超时
15         session.invalidate();
16         resp.getWriter().write("Session 已经设置为超时(无效) ");
17     }

  5、如何强制释放 Session?

session.getMaxInactiveInterval():该方法可以让 session 立刻失效

  6、可以使 Session 对象释放的情况有什么?

    (1)当 Session 对象空闲时间达到了目标设置的 最大值,自动释放;

    (2)Session 对象被强制失效;

    (3)Web 应用卸载;

    (4)服务器进程停止;

三、Session 原理

  Session 技术,底层实现是基于 Cookie 技术来实现的。

  原理示意图:

                          

                  

 

四、Session 细节

  1、当客户端关闭后,服务器不关闭,两次获取 session 是否为同一个?

    默认情况下不是同一个对象。

    如果需要相同,则可以创建 cookie对象,键为 JSESSIONID,设置最大存活时间,让 cookie 持久化保存。

    代码实现

1 Cookie c = new Cookie("JSESSIONID",session.getId());
2 c.setMaxAge(60*60);
3 response.addCookie(c);

  2、客户端不关闭,服务器关闭后,两次获取的 session 是同一个吗?

    不是同一个,但是要确保session中数据不丢失。Tomcat 会自动完成以下工作

    (1)session的钝化

       在服务器正常关闭之前,将 session 对象系列化到硬盘上。

    (2)session的活化

       在服务器启动后,将 session 文件转化为内存中的 session 对象。

  3、session 什么时候被销毁?

    (1)服务器关闭时,session 对象被销毁

    (2)session 对象调用 invalidate(),session 自动销毁

    (3)session 默认失效时间,30分钟。可以在 web.xml 配置文件中进行修改

1 <session-config>
2     <session-timeout>30</session-timeout>
3  </session-config>

 

五、URL 重写

  在整个会话控制技术体系中,保持 JSESSIONID 的值主要通过 Cookie 实现,但 Cookie 在浏览器端可能会被禁用,所以还需要一些备用的技术手段,如:URL 重写。

  URL 重写其实就是将 JSESSIONID 的值以固定格式附着在 URL 地址后面,以实现保持 JSESSIONID,进而保持会话状态。

  固定格式是:

URL;jsessionid=xxxxxxxxx

   例如:

targetServlet;jsessionid=F9C893D3E77E3E8329FF6BD9B7A09957

  实现方式:

response.encodeURL(String)
response.encodeRedirectURL(String)

  例如:

 1 //1.获取Session对象
 2 HttpSession session = request.getSession();
 3 
 4 //2.创建目标URL地址字符串
 5 String url = "targetServlet";
 6 
 7 //3.在目标URL地址字符串后面附加JSESSIONID的值
 8 url = response.encodeURL(url);
 9 
10 //4.重定向到目标资源
11 response.sendRedirect(url);

 

六、Session 的活化和钝化

  Session 机制很好的解决了 Cookie 的不足,但是当访问应用的用户很多时,服务器上就会创建非常多的 Session 对象,如果不对这些 Session 对象进行处理,那么在 Session 失效之前,这些 Session  一直都会在服务器的内存中存在,那么就出现了 Session 活化和钝化的机制。

  Session 的钝化:Session 在一段时间内没有被使用时,会将当前存在的 Session 对象序列化到磁盘上,而不再占用服务器内存空间;

  Session 的活化:Session 被钝化后,服务器再次调用 Session 对象时,将 Session 对象由磁盘加载到服务器内存中使用。

  注意:如果希望 Session 域中的对象也能够随着 Session 钝化过程一起序列化到磁盘上,则对象的实现类也必须实现 java.io.Serializable 接口。不仅如此,如果对象中还包含其他对象的引用,则被关联的对象也必须支持序列化,否则会抛出异常:java.io.NotSerializableException,如果没有实现该接口,只能被序列化,不能被反序列化。

 

五、Session的特点

  (1)session 用于存储一次会话的多次请求的数据,存在服务器端

  (2)session 可以存储任意类型,任意大小的数据

  session 与 cookie 的区别:

   (1)session 存储数据在服务器端,cookie 在客户端;

   (2)session 么有数据大小限制,cookie 有限制;

   (3)session 数据安全,cookie 相对于不安全;

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
密码管理程序--pwgrep

为了管理我的密码,我写了一个小的 bash/awk 脚本用来管理一个密码数据库并使用 GnuPG 进行加密。使用 pwgrep 的好处是: 密码加密 密码版本化,不用担心丢失老密码 Since a versioning sys...

匿名
2013/03/11
1.3K
0
全站 HTTPS 来了

各位使用百度、谷歌或淘宝的时候,有没有注意浏览器左上角已经全部出现了一把绿色锁,这把锁表明该网站已经使用了 HTTPS 进行保护。仔细观察,会发现这些网站已经全站使用 HTTPS。同时,iOS...

腾讯Bugly
2015/12/25
2K
5
CAS环境下的AJAX跨域

情况说明: 在单点登录的环境下,所有的文件上传都是通过webuploader上传到文件管理服务器。而webuploader的上传可以参考ajax的请求,相当于是跨域操作。 首先,跨域请求访问的问题,可以通过...

战五渣
2015/10/09
245
0
tomcat memecached session 共享同步问题的解决

web项目windows系统下实现session的共享 第一个步: 在俩个tomcat的context.xml这个文件中配置如下代码: <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memca......

海空天阔007
2015/10/12
759
4

没有更多内容

加载失败,请刷新页面

加载更多

什么是移动语义? - What is move semantics?

问题: I just finished listening to the Software Engineering radio podcast interview with Scott Meyers regarding C++0x . 我刚刚结束了对Scott Meyers进行的有关C ++ 0x的Software En......

技术盛宴
今天
24
0
算法与数据结构体系课

算法与数据结构体系课【超清原画】 下载地址:百度云盘 从0到工作5年,面试、进大厂、搭建知识体系、拓展技术上限 你不再需要其它算法与数据结构课程了 为什么学算法已经是一个不应该问的问题...

1930133570
今天
21
0
如何停止跟踪并忽略对Git中文件的更改? - How to stop tracking and ignore changes to a file in Git?

问题: I have cloned a project that includes some .csproj files. 我已经克隆了一个包含一些.csproj文件的项目。 I don't need/like my local csproj files being tracked by Git (or bei......

富含淀粉
今天
25
0
Redis阻塞

可能存在问题 内在原因:API或数据结构使用不合理、CPU饱和、持久化阻塞等 外在原因:CPU竞争、内存交换、网络问题等 问题处理: API或数据结构使用不合理,可能存在慢查询或者大对象: 发现...

游泳鸟
今天
17
0
OSChina 周五乱弹 —— 来人,上幼儿园老师跳舞的图!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑:《奇跡の海》- 坂本真綾 《奇跡の海》- 坂本真綾 手机党少年们想听歌,请使劲儿戳(这里) 巴蜀(@巴拉迪维)最近有点闹心了, @巴...

小小编辑
今天
64
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部