会话技术Session

会话技术Session

当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,

当客户端后续访问服务器时,只要将标识号传递给服务器,

服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。

需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,

因此,通常情况下,Session是借助Cookie技术来传递ID属性的。

服务器会为每个客户端在服务器内存里创建单独的存储空间,存储空间每个客户端私有.

Session 技术的特点:
1) 运行在服务器端,由服务器为每个浏览器创建单独的存储空间对象,称为服务器会话对象。

2) 每个用户都有自己的会话对象,不同的浏览器代表不同的用户。

3) 会话对象也是一个域对象,主要用于在服务器端存储每个用户自己的数据,
不同的用户之间数据不能共享。
Session的有效期默认是30分钟.
服务器会为每一个Session对象创建一个唯一标识ID属性.

session的应用场景

1. 保存购物车数据
2. 保存用户浏览器记录数据
3. 保存用户登录信息数据
4. 保存验证码

session的基本使用

创建Session对象

"注意:使用request对象调用getSession()方法创建Session对象."

格式:request对象.getSession();
例:Session session = request.getSession();

session是域对象(会话域对象)

域对象可以存储数据,session是会话域对象,默认一次会话过程内有效.

从客户端浏览器第一次访问服务器开始,到浏览器关闭,
期间可以进行一系列的请求与响应,这个过程称作为一次会话过程.
HttpSession
void setAttribute(String name, Object value) 在session中保存数据

Object getAttribute(String name) 从session中获取数据
//getAttribute方法返回值是Object,因此需要将返回值强制转换才能方便使用。

void removeAttribute(String name) 从session中移除数据

使用步骤

1. 在SessionServlet通过request对象创建Session

2. 在SessionServlet调用session的setAttribute保存数据

3. 在SessionServlet调用session的getAttribute获取数据

4. 在SessionServlet1通过request对象获取session对象

5. 在SessionServlet1调用session的removeAttribute移除数据

6. 在SessionServlet1调用session的getAttribute获取数据
//创建Session
HttpSession session = request.getSession();

//添加数据
session.setAttribute("addr","广州");
//创建Session
HttpSession session = request.getSession();

//获取数据
String addr = (String) session.getAttribute("addr");
System.out.println(addr);

//移除数据
session.removeAttribute("addr");

//再次获取,查看效果
String addr1 = (String) session.getAttribute("addr");
System.out.println(addr1);

session的默认有效期

session的默认有效期是一次会话内,关闭了浏览器session就没用了,

但是session对象依然存储在服务器内存中,session对象并没有销毁,

session默认有效期30分钟.

距离最后一次请求超过30分钟,session过期.

改变会话过期的时间

方式一:在web.xml中配置session过期时间

1). 通过 web.xml 中的配置
<!-- 配置会话的时间,以分钟为单位 -->
<session-config>
<session-timeout>100</session-timeout>
</session-config>

2). session-timeout 的解释:
如果设置为 0 或负数,则会话不过期,但受限于服务器的内存空间。

注意:一般没有人会去更改session默认30分钟有效期。
添加web.xml方式

方式二:会话立刻失效(最有用)

session.invalidate();

应用场景,注销登录。就是让session立刻过期

session.removeAttribute(“loginUser”);也可以的

Session技术的运行原理

每次访问服务器,服务器会调用getSession()

判断cookie中是否有指定JSESSIONID的session,

有就返回指定的session对象,

没有该指定JSESSIONID的session,或者没有cookie,

就//创建新的session对象,默认session的有效期是30分钟

并且//创建新的cookie写入创建的session对象的JSESSIONID,
默认cookie有效期是浏览器关闭就删除

//浏览器关闭后,再次打开浏览器可以继续访问已有的session?
//关闭浏览器,重新打开浏览器访问的是新的session,
//因为cookie采用默认有效期,浏览器关闭cookie将删除,会产生新的session,
//所以要延长cookie有效期,才能访问已有session

//也就是只是我们使用已有JSESSIONID创建cookie,
//服务器判断cookie是否已被创建,创建了服务器就不会再创建cookie

session实现关闭浏览器继续可以访问数据

1. 创建session对象

2. 通过request对象获取session的id

3. 自定义一个cookie对象,保存session的id,
注意cookie名称为"JSESSIONID",设置一个比较长的生存时间

4. 发送给浏览器
//创建session对象
HttpSession session = request.getSession();

System.out.println(session);

//自己创建一个cookie,要求被浏览器持久化保存起来(setMaxAge(10000))放便后期使用
Cookie cookie = new Cookie("JSESSIONID", session.getId());

//活的久一点
cookie.setMaxAge(10000);

//发送给浏览器
response.addCookie(cookie);

session的钝化与激活

session对象是服务器内存里的一个对象,服务器正常关闭以后,
服务器会将session中的数据进行序列化成一个文件,这个过程就叫做session钝化,

当前服务器启动的时候会将序列化的文件进行反序列化,
在服务器内存中恢复session的数据,这个过程就叫做session激活。

客户端禁用cookie的session解决方案

如果客户端禁用了cookie怎么办?cookie无法传递JSESSIONID

cookie无法传递了,但是可以进行URL重写进行传递jsessionid
http://localhost:8080/demo/getSessionData;jsessionid=84B2DDE4630C6D9FEE3A72B632D80284

手动重写格式:   ;jsessionid=84B2DDE4630C6D9FEE3A72B632D80284

自动重写URL 

//URL重写方法,这个方法就会在已有url基础上加上JSESSIONID
String url = response.encodeRedirectURL("/demo/getSessionData");

//跳转到重新后的URL去
response.sendRedirect(url);


cookie默认有效期浏览器关闭,session默认有效期30分钟,
如果你想cookie与session有效期一致?
手动创建cookie,设置名字JSESSIONID,内容为该session的id,有效期是30分钟。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值