标签:
思考两个问题:
1. 大家在网上买东西,张三和李四他们购买的商品不一样,他们的购物车中显示的商品也不一样,这是怎么实现的?
2. 不同的用户登录网站后,不管该用户浏览该网站的哪个页面,都可以显示登录人的名字,同样可以随时去查看自己的购物车中的商品,这是怎么实现的?
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
当用户打开浏览器,访问某个网站操作session时,服务器就会在服务器的内存为该浏览器分配一个session对象,该session对象被这个浏览器独占。
这个session对象也可以看做是一个容器,session默认存在时间为30min,你可以修改。
看如下示意图:
session不是特别好理解,你可以把session看做是一容器类似于HashMap,有两列。每一行就是session的一个属性。
每个属性包含两个部分,一个是该属性的名字(String),另外一个是它的值(Object)
名字String | 值Object |
---|---|
那么,如果同一个用户浏览器,向session设置一个属性的时候,如果名字相同,会出现什么情况?
结论:跟Cookie一样,这个值会更新,会替换为新的值
// 返回这个request绑定的session对象,如果没有,则创建一个
HttpSession session = request.getSession();
// 返回这个request绑定的session对象,如果没有,则根据create的值决定是否创建一个
HttpSession session = request.getSession(boolean create)
2.向session中添加属性
session.setAttribute(String name,Object val);
3.从session中得到某个属性
String value = session.getAttribute(String name);
4.从session中删除某个属性
session.removeAttribute(String name);
可以做如下测试:
Servlet1生成session,并放入属性,它的doGet方法:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//访问session[当发现没有session的时候,就会自动创建一个session]
HttpSession session = request.getSession();
// 给该session放入属性
session.setAttribute("name", "小明");
session.setAttribute("age", "18");
//session的生命周期默认是30min,但是你也可以修改
//session.setMaxInactiveInterval(interval);
out.println("创建了session,并放入了两个属性,name和age");
}
从Chrome浏览器打开Servlet1,可以看到结果:
Servlet2获取session,并读取属性,它的doGet方法:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 获取session
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
String age = (String) session.getAttribute("age");
out.println("name:"+name+"age:"+age);
}
再从Chrome浏览器打开Servlet2,可以看到结果:
这是在同一个浏览器中打开的两个不同的标签页,那么如果我们换一个浏览器呢,比如换成MicroSoft Edge浏览器:
可以看到这时候name和age都是null,也就是没有从session对象中取出值,因为Edge浏览器并没有运行Servlet1来创建Session对象,上面的session对象是Chrome浏览器独占的。
要强调的是,因为session是存在于服务器的内存中的,所以session对象的值也是可以存放对象的,并不像Cookie一样,仅仅是字符串!
比如,我们可以把一个User对象放入session对象中:
// 创建对象
User user = new User();
user.setName("小猫");
user.setColor("红色");
session.setAttribute("cat", user);
之后,我们可以从session对象中取出这个User对象:
// 获取User
User user = (User)session.getAttribute("cat");
session中的属性的默认生命周期是30min,这个默认时间可以通过修改web.xml文件来修改
这样修改:
1.在Tomcat根目录\conf\web.xml文件中修改:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
这样修改会对所有的web应用生效。
2.如果只需要对某一个web应用设置,则只需要修改对应web应用的web.xml文件。在这个web.xml文件中添加如上的代码,比如你要设置为10分钟,则添加:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
除了设置默认生命周期之外,最重要的是在程序中设置,调用setMaxInacttiveInterval(int interval)
,这里的interval是以秒为单位的,而且这个方法设置的是发呆时间,比如你设置的是60秒,那么在这60秒之内如果你没有操作过session,它就会自动删除,如果你操作过,不管是设置属性还是读取属性,它都会从头开始计时。
session.setMaxInactiveInterval(60);
这个应用很广:比如我们逛购物网站,如果我们登录成功并且一直在操作、浏览网页,那么这个会话(Session)就一直保持,也就是我们一直处于登录状态。而如果我们隔了一段时间没有逛这个网站了,那么再逛的时候就会看到自己是未登录状态,因为会话(Session)已经过期了。
如果重启Tomcat,或者reload自己的web应用,或者关机了,那么web应用的session就会失效,这个结论很明显,因为session是存在于服务器的内存中的。
另外,我们也可以通过函数来让session失效:invalidate()
,这个函数清除session,删除一切会话。它通常用于安全退出某个网站。
要注意的是,
invalidate()
函数是清除所有session,如果你只要清除一个单个的属性,那么就要使用session.removeAttribute()
方法。
1.session是存在服务器的内存中的
2.一个浏览器独享一个session域对象
3.session中可以存放多个属性
4.session中可以存放对象
5.如果session设置的属性存在重名,则会替换为新的值
标签:
原文地址:http://blog.csdn.net/gavin_john/article/details/51355292