Session随便写的(抄书笔记)
会话是web开发中常用的一种对象。
会话是存在于服务器端的对象,因此会话超时是保证性能效率的必要手段,本章将学习几种常用的使会话失效的办法。
大多数容器都使用cookie作为会话跟踪的基础,但是cookie机制可能被客户端禁止。本章将学习如何使用URL重写,保证会话被禁止时会话机制仍然有效。
客户端对服务器端一次连续的访问过程,称为会话
HttpSession接口用来表示会话对象
HttpSession中和属性有关的方法
public void setAttribute(String name,Object value)
public Object getAttribute(String name)
public void removeAttribute(String name)
通过请求对象的方法获得会话对象
HttpServletRequest:
public HttpSession getSession()获得与当前请求相关的Session对象,如果当前请求中不存在Session对象,则创建一个新的session对象返回
public HttpSession getSession(boolean create) 如果参数为true,与getSession()没有区别,如果参数为false,当不存在session的时候直接返回null
请求和会话都可以存储属性,但是有什么呢区别呢?
请求和会话都可以存储属性,但是请求对象的生命周期短,除了请求转发可以将请求转发下去,其他情况下请求对象都会被重新创建。而会话对象在一次会话过程中,都会唯一维护一个会话对象。因此,只有存储到会话对象中的属性才考虑使用会话对象传递。只要请求范围使用的属性,都应该使用请求对象传递,以保证性能和效率
JSP中的会话对象
jsp中内置对象session,是HttpSession对象
默认情况下,jsp总是创建session对象,可以直接使用
我们知道在Servlet中使用Session对象之前,都必须使用请求对象获取会话对象:
HttpSession session=request.getSssion();
而如果在JSP中使用Session对象,可以直接使用Session内置对象
<%
Session.setAttribute("obj","test");
String obj=(String)session.getAttribute("obj");
%>
内置对象session是容器声明并创建的对象,所以子啊JSP文件中不需要声明,可以直接使用,但是名字必须为session,大小写敏感。
会话的实现机制:
会话的实现依赖于容器
大多数容器采用基于cooki的实现机制
基于cookie的实现机制,采用名为JSESSIONID的cookie作为session的唯一标识
HttpSession是容器创建的额对象,并存储在容器中,每个会话对象都与一个特定的客户端相关,那么容器是如何维护HttpSession对象与客户端一对一的关系的呢?大多数容器使用cookie机制来实现会话机制,例如Tomcat就是使用cookie机制实现会话跟踪。
当容器创建一个新的HttpSession对象后,即生成一个随机数,称为会话id,并将id的值封装给一个名为JSESSIONID的cookie,返回给客户端存在内存中。当应用程序通过request.getSession()获得会话对象时,容器先从当前的request对象中获取JSESSIONID值,根据JSESSIONID值查找对应的session对象,如果存在,则返回使用,否则将创建新的对象返回.如果没有获取到JSESSIONID的值,认为当前请求没有相关联的session对象。
由于jsp文件中总是默认创建session内置对象,所以只要访问一次jsp文件,容器就会创建一个session对象,创建一个session对象后,容器就会为该session生成一个随机数ID,是一个十六进制的随机整数,并把这个id存为一个名为JSESSIONID的cookie。因此下次访问该jsp文件时,就能获得一个名字是JSESSIONID的cookie,其值就是容器生成的会话id。
URL重写
通过修改客户端浏览器设置,可以禁止发送cookie
如果cookie被禁止,那么基于cookie实现的session将失效
为了解决cookie禁止session失效的问题,可以使用URL重写技术
URL重写:
就是通过HttpServletResponse中的encodeURL方法,将JSESSIONID的值强制追加到URL当中,保证即使cookie被阻止后JSESSIONID仍然能传递到服务器
<a href="<%=response.encodeURL("getpersonal")%>">View my person info. </a> <br/>
这里使用response.encodeURL将getpersonal的地址重新编码,将JSESSIONID的值强制加到URL中,保证即使cookie被阻止后JESSIONID依然能够被传递到服务器。
观察这个图,你就发现,地址栏发生了变化:
会话超时
为了有效使用内存,以及保证安全性,会话在一定时间内不被使用(称为会话超时),将被销毁
有三种策略可以使会话超时:
web.xml中配置会话超时时间(分钟)
<session-config>
<session-timeout>40</session-timeout>
</session-config>
使用setMaxInactiveInterval设置超时时间
public void setMaxInactiveInterval(int interval) 对于具体的一个session对象,可以通过调用setMaxInactiveInterval方法设定最大不活动时间,超过这个时间会话没有被访问,即被容器销毁
使用invalidate方法直接将某会话设置为失效
public void invalidate() 任何一个session对象,调用invalidate方法,都会被立即销毁,同时被绑定到session上的属性也将被解除,不能再次使用
Session随便写的(抄书笔记)的更多相关文章
- cookie随便写的一点笔记(抄书的)
cookie是保存在客户端的文本,能够在一定程度上提高用户体验.Servlet API 中提供了Cookie类,可以创建Cookie对象,并通过响应中的addCookie方法,将cookie保存到客户 ...
- 使用Atom写你的笔记
使用Atom写你的笔记 本文参考简书笔记. 使用sync-settings同步你的Atom设置 使用sync-settings插件需要以下3个条件: 电脑已安装Atom Atom内已安装sync-se ...
- Typora+PicGo+阿里云写博客笔记
Typora+PicGo+阿里云写博客笔记 选择这三个工具的理由 我一直有在使用typora使用mardown写作,毕竟typora很香,可以实时预览,非常丝滑. 配合上PicGo这个图床工具简直绝了 ...
- ActionScript 3.0 自写类整理笔记(十三)——Random类
一个简单的随机函数工具类,总共提供了9种静态方法来获取不同的随机值随便写的,如果你还有什么更好的建议,请提出来,谢谢~ index.Random类:代码:public final class Rand ...
- Jquery 随便写些知识点
针对jQuery随便写些觉得还挺实用的一些东西,也没系统的去理一番,只是想到哪写到哪,写的不完全也请多见谅. jQuery和其他javascript库产生$符号冲突了?$符号想必用jQuery的人都不 ...
- 随便写一点最近开发遇到的问题和解决方法 大部分关于laravel和php
laravel里要想对对象进行自己设计的排序(usort()), 得用匿名方法, 原声php就不用 php里面可以随便写html代码, 比如可以把html直接后缀名改成.php, 然后在任何地方& ...
- 对于写Python学习笔记的看法
学习写笔记是一个不错的学习方法,好些同学在学习Python过程中也会写学习笔记.俗话说好记性不如烂笔头,我很赞同这个说法. 我列举几个学习Python写笔记的好处: 1.Python知识的二度巩固 通 ...
- 让自己写的电子笔记连文带图全平台兼容(MarkDown图片显示兼容)
目录 一.工具使用 语言使用:MarkDown 简介 使用原因 使用方法 软件使用:Typora 简介 环境设置搭建 1)搭建图床 2)配置PicGo 3)配置typora 4)测试 图片上传测试 平 ...
- ASP.NET 使用application和session对象写的简单聊天室程序
ASP.Net中有两个重要的对象,一个是application对象,一个是session对象. Application:记录应用程序参数的对象,该对象用于共享应用程序级信息. Session:记录浏览 ...
随机推荐
- POJ 2023 Choose Your Own Adventure(树形,dfs,简单题)
题意: 输入一个整数n,表示有n组测试数据, 每组第一行输入一个整数x表示该组测试一共有x页,接下来输入x行,每行表示一页, 每页或者以C开头(第一页都是以C开头),或者以E开头,中间用引号括起一段文 ...
- Android内存泄漏问题(一)
前言 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露. 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用, ...
- UVA 10635 Prince and Princess
题意描述:有两个长度分别为p+1和q+1的序列,每个元素中的各个元素互不相同.都是1~n^2之间的整数,求A和B的最长公共子序列.(2<=n<=250,1<=p,q<=n^2) ...
- tomcat下context.xml中JNDI数据源配置
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- lintcode:买卖股票的最佳时机 I
买卖股票的最佳时机 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. 样例 给出一个数组样例 [3,2,3 ...
- WPA/WAP2wifi 密码破解笔记
前言: 相对于前一段时间脆弱的WEP路由器而言,当今的路由器加密方式也大都改变为WPA/WPA2,使得无线路由器的破解难度增加.虽然如此,但还是有很多漏洞层出不穷,如WPS.退一步来说,即使加密算法无 ...
- MySQL数据库的基本操作命令
MySQL数据库的基本操作命令 [mysql]mysql 常用建表语句 一.mysql服务操作 net start mysql //启动mysql服务 net stop mysql //停止mysql ...
- How a woman's glance can tell a man if she's interested
How a woman's glance can tell a man if she's interested揭秘:女人是否喜欢你?看眼神就知道The female mind has always b ...
- http://my.oschina.net/pangyangyang/blog/144495
http://my.oschina.net/pangyangyang/blog/144495
- MySQL 数据库性能优化之索引优化
接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...