`

Java中的Session和作用域

    博客分类:
  • Java
阅读更多
几乎所有的Web开发语言都支持Session功能,Servlet也不例外。 Servlet/JSP中的Session功能是通过作用域(scope)这个概念来实现的。

作用域分为四种,分别为:

page 在当前页面有效(仅用于JSP中)
request 在当前请求中有效
session 在当前会话中有效
application 在所有应用程序中有效

是不是看不太明白?page因为仅用于JSP中,这里只讲述其他三种作用域。首先要声明的一点,所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。

话说武松一日来到景阳岗,见一旗帜迎风飘扬,旗子上书五个大字“三碗不过岗”。武松叫道:“店家,拿三碗酒来,再切两斤熟牛肉!”店小二应声道:“三碗好酒,二斤熟牛肉啰~~”里面厨师赶忙当当当当切好牛肉,店小二倒上三碗酒,店小二端上前来。

武松咕咚咕咚连干三碗,叫一声“好酒!店家,再来三碗!”小二忙又倒上三碗好酒,武松一饮而尽。就这样前前后后武松一共喝了十八大腕。付了帐刚要走,店小二道: “客官,这前面山上有大虫,客官刚刚喝完十八碗酒恐怕过不得岗,不如在小店暂住一夜,待明天和猎户一同过岗岂不是好?”

之后武松说什么就留待各位看官自己去回忆啦。在这段武松打虎中,大家有没有看到些熟悉的东西?

武松: 浏览器。
酒馆: 服务器。
店小二、厨师: Servlet或者JSP。
来三碗好酒!: 浏览器向服务器发出HTTP请求。
店小二上酒: 服务器的响应。
武松从进店到离开: 一个HTTP对话。
我们可以看到,Web交互的最基本单位为HTTP请求(武松点菜)。每个用户从进入网站到离开网站这段过程称为一个HTTP会话 (武松进店到出店),一个服务器的运行过程中会有多个用户访问,就是多个HTTP会话(酒馆当然不可能只接待武松一个客人)。那么作用域就可以理解为:

request HTTP请求开始到结束这段时间
session HTTP会话开始到结束这段时间
application 服务器启动到停止这段时间

request

一个HTTP请求的处理可能需要多个Servlet合作(武松点菜时店小二就要吩咐厨房做菜),几个Servlet之间可以通过某种方式传递信息(店小二就用吆喝的方式通知厨房),但这个信息在请求结束后就无效了(厨房在做完菜之后就不用再管这道菜的事儿了)。

Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的:

void setAttribute(String name, Object value)
将对象 value 以 name 为名称保存到request作用域中。
Object getAttribute(String name)
从request作用域中取得指定名字的信息。
doGet()、doPost()函数的第一个参数就是 HttpServletRequest 对象,使用这个对象的 setAttribute 即可传递信息。

那么设置好信息之后,如何将信息传给其他Servlet?这就要用到 RequestDispatcher 接口的 forward 方法,将请求转发给其他Servlet。

RequestDispatcher ServletContext.getRequestDispatcher(String path)
取得Dispatcher以便转发。path为转发的目的Servlet。
void RequestDispatcher.forward(ServletRequest request, ServletResponse response)
将request和response转发。
因此,只要在当前Servlet中先 setAttribute,然后forward,最后在forward到的Servlet中 getAttribute即可实现信息传递。

PHP的程序员可能不太好理解这一段,因为PHP中没有转发的概念,一个请求只能由一个PHP文件来处理,所以PHP中根本没有request作用域的概念。而Servlet则不同,请求可以在应用程序中任意转发,所以用request作用域在不同Servlet之间传递信息。需要注意两点:

转发不是重定向,转发是在Web应用内部进行的。PHP支持重定向但没有转发。
转发对浏览器是透明的,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个Servlet的地址。
session

session作用域比较容易理解,同一浏览器访问多次,在这多次访问之间传递信息,就是session作用域。 ('''武松每次点菜帐房先生都要记一笔账,等武松走之前结帐用。这笔帐在武松吃饭过程中始终有效,即位于session作用域中''')

session是通过HttpSession接口实现的。

Object HttpSession.getAttribute(String name)
从session中获取信息
void HttpSession.setAttribute(String name, Object value)
向session中保存信息
而通过HttpServletRequest.getSession()方法可以获得HttpSession对象。

HttpSession HttpServletRequest.getSessio()
获取当前请求所在的session的对象。
session的开始容易判断(浏览器发出第一个HTTP请求即可认为会话开始),但结束就不好判断了(因为浏览器关闭时不会通知服务器“我关了,会话可以结束了”),所以只能通过这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。 Tomcat的默认值为120分钟,但这个值也可以通过 HttpSession 的 setMaxInactiveInterval 方法来设置。

void setMaxInactiveInterval(int interval)
设置绘画的超时值。
如果想主动让会话结束,如用户单击“注销”的时候,可以使用 HttpSession 的 invalidate 方法:

vooid invalidate()
强制结束当前session。
application

application作用域就是服务器启动到关闭的整段时间,在这个作用域内设置的信息可以被所有应用程序使用。 (餐馆打烊后结帐,用到的即是开张到打烊之间的所有信息。)

还记得上一节提到的ServetContext吗? application作用域上的信息传递就是通过ServetContext实现的。

Object getAttribute(String name)
从application中获取信息。
void setAttribute(String name, Object value)
向application作用域中设置信息。
总结

可以看到,每个作用域除了实现接口不同、意义不同之外,它们的使用方法和作用都是相同的,都是通过 getAttribute 和 setAttribute 方法进行信息传递。

作用域 意义 实现接口
request HTTP请求内 HttpServletRequest
session HTTP会话内 HttpSession
application 服务器生命周期内 ServletContext
5
0
分享到:
评论

相关推荐

    session 作用域

    初学者使用,建议去看看初学者这是一个很好的java wed代码

    struts2访问request,session,application作用域

    本文讲述了serlvet API无耦合的方式

    Java中设置session超时(失效)的三种方法

    session的作用:request.getSession()可以帮你得到HttpSession类型的对象,通常称之为session对象,session对象的作用域为一次会话,通常浏览器不关闭,保存的值就不会消失,web.xml中有一个session time out的地方,...

    java面试大全视频版

    Java面试题01.面试的整体流程 Java面试题02.java的垮平台原理 Java面试题03....内置对象和四大作用域和页面传值 Java面试题22.Session和Cookie的区别和使用场景 Java面试题23.mvc模式和mvc各部分的实现

    jsp的九大内置对象和四大作用域

    jsp的九大内置对象和四大作用域.一共有九大内置对象: request、response、out、session、application、pageContext、page、config、exception 四大作用域 page(页面作用域),request(请求作用域),session(会话...

    Android通过全局变量传递数据

    在Activity之间数据传递中还有一种比较实用的方式 就是全局对象 实用J2EE的读者来说都知道Java Web的四个作用域 这四个作用域从小到大分别是Page Request Session和Application 其中Application域在应用程序的任何...

    Session Cookie的HttpOnly和secure属性

    如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。 对于以上两个属性, 首先,secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    内置对象和四大作用域和页面传值.mp4 │ Java面试题22.Session和Cookie的区别.mp4 │ Java面试题23.mvc模式和mvc各部分的实现.mp4 │ Java面试题24.数据库分类和常用数据库.mp4 │ Java面试题25.关系型数据库的三...

    jsp 九种内置对象, 四种作用域

    JSP的九大内置对象 request:封装客户端的请求,包含来自GET或POST请求的参数; response:响应对象,代表的是从服务器向浏览器响应数据; pageContext:提供了对JSP页面所有的...JSP中的四种作用域 pagepage作用域表示

    Java常见面试题208道.docx

    96.spring 支持几种 bean 的作用域? 97.spring 自动装配 bean 有哪些方式? 98.spring 事务实现方式有哪些? 99.说一下 spring 的事务隔离? 100.说一下 spring mvc 运行流程? 101.spring mvc 有哪些组件? 102.@...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    内置对象和四大作用域和页面传值 Java面试题22.Session和Cookie的区别和使用场景 Java面试题23.mvc模式和mvc各部分的实现 Java面试题24.数据库分类和常用数据库 Java面试题25.关系型数据库的三范式 Java面试题26....

    java 面试题 总结

    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...

    java面试宝典

    2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short s1 = 1; s1 = s1 + 1;有什么错? 8...

    史上最全java面试,103项重点知识,带目录

    96. spring 支持几种 bean 的作用域? 58 97. spring 自动装配 bean 有哪些方式? 59 98. spring 事务实现方式有哪些? 59 99. 说一下 spring 的事务隔离? 59 100. 说一下 spring mvc 运行流程? 60 101. spring ...

    JSP/Servlet Java面试逻辑题

    1、说一说Servlet的生命周期?★★★★★ 答: servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。...这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    8.2.1 Session Bean的概念和作用 302 8.2.2 Message Driven Bean的概念和 作用 303 8.2.3 实体和JPA 303 8.3 开发无状态的Session Bean 304 8.3.1 开发远程调用的无状态 Session Bean 304 8.3.2 开发本地调用的无...

    Java面试宝典2020修订版V1.0.1.doc

    12、作用域public,private,protected,以及不写时的区别? 16 13、Overload和Override的区别。 16 14、构造器可不可以被重载或重写? 16 15、Java中有没有多继承? 16 16、抽象类和接口的区别? 17 17、java中实现...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.2.1 Session的缓存的作用  8.2.2 脏检查及清理缓存的机制  8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4...

    java语言hebernate代码

    1.两种加载模式 a:及时加载 使用get时是一及时加载的一种 当使用get时,他会直接发送SQL,去和数据库交互 ... 对象从session作用域分离出来的时候我们叫做游离(脱管) 即:调用delete,clear,evict等方法时

    Java面试宝典-经典

    17、请说出作用域public,private,protected,以及不写时的区别 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14 19、构造器Constructor是否可被override? 15 20、接口是否可继承...

Global site tag (gtag.js) - Google Analytics