(10) Session

简述:
① Session 是存在于服务器内存中的
② 一个浏览器独享一个 Session 对象(这里的一个浏览器是指一个进程的浏览器)
③ Session 默认的生命周期是 30 分钟,可以自己设置

获取 Session :
如果没有创建 Session 时,会自动创建一个。

HttpSession session = request.getSession( );
HttpSession session = request.getSession( boolean );
// true 和空参数没有区别
// false 代表,如果当前没有 Session,就不用创建了

设置 Session 生命周期的方式:
① Tomcat 中的 Web.xml 设置

<session-config>
    <session-timeout>30</session-timeout> 以分钟为单位
</session-config>

② 在单个 Web 应用中修改,Web.xml,同上

<session-config>
    <session-timeout>30</session-timeout> 以分钟为单位
</session-config>

如果发生冲突,则以 Web 应用为准。
如果访问,或者修改了 Session 中的值,都会重置生命周期(与 Cookie 不同)。

③ session.setMaxInactiveInterval( 秒 )
如果在规定时间内,没有访问或者操作 Session,就会销毁,否则会重置。
Session 的销毁属于全部销毁,并不能单独设立一个属性值的生命周期,与 Cookie 不同。

④ session.invalidate( )
使 Session 失效,安全退出使用这个技术点。

⑤ session.removeAttribute( String )
删除单个元素

为什么不同浏览器会独享 Session?

浏览器访问 Session 原理图:
这里写图片描述
步骤4:返回 JSESSIONID 保存到本地浏览器的 Cookie,这个 Cookie 有效期是临时的,浏览器关闭后,此 Cookie 失效。这就是关闭浏览器后不能访问原 Session 的原因。

HTTP 截图:
第一次访问设置 Session 时的 HTTP 请求:↓
没有任何 Cookie 值
这里写图片描述

第一次访问 Session 时,返回的 HTTP 响应: ↓
发现返回了一个 Set-Cookie:JSESSIONID=123456
这里写图片描述

② 第二次再次访问同一个 servlet 时(没有关闭浏览器):↓
HTTP 请求,发送了 JSESSIONID 来获取 Session 对象
这里写图片描述

③ 重启浏览器访问相同 Servlet ,这个 保存 Session ID 的 Cookie 消失
HTTP 请求 ↓
这里写图片描述

HTTP 响应 ↓
发现得到不同的 Session,但是原来的 Session 不一定销毁,销毁时间取决于自己的生命周期
这里写图片描述

如何再关闭浏览器后再访问相同的 Session?
① 当服务器第一次给浏览器 ID 后,浏览器关闭,这个保存 ID 的 Cookie 也就消失了。
② 我们可以手动保存,用 Cookie 保存这个 ID,这样就可以做到关闭浏览器后,
只要这个 Cookie 没有消亡,就会返回 ID,得到 Session
③ 用 session.getId( ) 返回这个 Session 的 ID
④ 用 Cookie 存 ID 时,name 一定要和规定的一样,全部大写,JSESSIONID = ……
⑤ 当保存了 Cookie 后,重启浏览器再次访问时,HTTP 请求会把 Cookie 值传过去,返回原 Session 对象

如果浏览器禁用了 Cookie 会导致 Session 失效:
第一次访问 Session 时,返回的 Id 需要存放到 Cookie 中,但是浏览器禁用 Cookie,无法保存 Id,就导致原先的 Session失效。

如何实现 IE 禁用 Cookie 后,我们还可以继续使用 Session?
url 地址重写,在重写前,要访问一下 Session,之后就会自动把 JSESSIONID 通过 url 拼接过去。原理就是通过 url,把 ID 传到浏览器。

代码案例:↓
文件1:
编码url,自动将 Cookieid 封装到了 url

// 必须先访问 Session 才有 ID 值
HttpSession httpSession = request.getSession();
httpSession.setAttribute("name", "张三");
// 返回封装好了 ID 值的 url
String url = response.encodeRedirectURL("/SessionDemo/Demo2");
out.println("<a href='"+url+"'> 访问 Session </a>");

文件2:
不需要做任何的处理,自动的获取 ID 返回传来的 Session,方法内已经帮我们封装好了,不需要手动取出。

HttpSession httpSession = request.getSession();
String nameVal = (String) httpSession.getAttribute("name");

Session 销毁时间的讨论:
我们的 Session 生命周期如果是 30min,该 Session 不会随浏览器的关闭,而自动销毁。
关闭浏览器,服务器不会接收到任何通知,直到时间到了,才会销毁。而是到 30min 后,才会被服务器销毁。
所以我们要点击安全退出,销毁自己在服务器端的 Session

Session 的用途:
1. 购物车
2. 保存用户登录的信息
3. 将某些数据保存到 Session 中,供其他页面使用
4. 防止用户非法登录到某个页面

Cookie 和 Session 的比较:
1. 保存的位置
Cookie 存在客户端的 临时文件夹
Session 存在服务器的内存中,一个 Session 对象为一个用户浏览器服务
2. 安全性
Cookie 以明文方式存放,需要通过md5加密
Session在服务器内存中,较为安全
3. 网络传输量
Cookie 会传递信息给服务器
Session 的属性值不会给客户端
4. 生命周期
Cookie 是累计的,时间一过,就失效
Session 是间隔的,只要在时间期间内访问了,就会重新计算时间间隔
关闭浏览器后,并不是让 Session失效,而是存储 Session ID 的 Cookie 消失了,但是在内存中
还可能存在 Session,我们需要使用 invalidate 销毁 Session
5. 使用原则
Session 会占用服务器内存,因此不要向 Session 中存放过多过大的对象,会影响性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
If Not IsObject(application) Then Set SapGuiAuto = GetObject("SAPGUI") Set application = SapGuiAuto.GetScriptingEngine End If If Not IsObject(connection) Then Set connection = application.Children(0) End If If Not IsObject(session) Then Set session = connection.Children(0) End If If IsObject(WScript) Then WScript.ConnectObject session, "on" WScript.ConnectObject application, "on" End If session.findById("wnd[0]").maximize session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4431/subSUBSCREEN_TC:SAPMV45A:4909/tblSAPMV45ATCTRL_U_ERF_WERTKONTRAKT").getAbsoluteRow(0).selected = true'选中一个item session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4431/subSUBSCREEN_TC:SAPMV45A:4909/tblSAPMV45ATCTRL_U_ERF_WERTKONTRAKT/txtVBAP-POSNR[0,0]").setFocus session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4431/subSUBSCREEN_TC:SAPMV45A:4909/tblSAPMV45ATCTRL_U_ERF_WERTKONTRAKT/txtVBAP-POSNR[0,0]").caretPosition = 5 session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4431/subSUBSCREEN_TC:SAPMV45A:4909/subSUBSCREEN_BUTTONS:SAPMV45A:4052/btnBT_PKSE").press session.findById("wnd[0]/tbar[1]/btn[43]").press'进入Pricing agreement 编辑界面 session.findById("wnd[1]/usr/ctxtRV13A-KSCHL").text = "ZS61" '输入ZS61 condition type session.findById("wnd[1]/usr/ctxtRV13A-KSCHL").caretPosition = 4 session.findById("wnd[1]/tbar[0]/btn[0]").press session.findById("wnd[2]/usr/sub:SAPLV14A:0100/radRV130-SELKZ[4,0]").select’选择Key combination session.findById("wnd[2]/usr/sub:SAPLV14A:0100/radRV130-SELKZ[4,0]").setFocus’选择SD Document/Item/Product Hierachy level 1 session.findById("wnd[2]").sendVKey 2 session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/ctxtKOMG-PRODH1[0,0]").text = "SP"'放入SP备件 session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/txtKONP-KBETR[2,0]").text = "100"'放入100%折扣 session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/ctxtRV13A-DATAB[8,0]").text = "01.01.2023"'放入开始生效session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/ctxtRV13A-DATBI[9,0]").text = "04.03.2024"'放入结束生效session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/ctxtRV13A-DATBI[9,0]").setFocus session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/ctxtRV13A-DATBI[9,0]").caretPosition = 10 session.findById("wnd[0]/tbar[0]/btn[11]").press
06-10

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值