您的位置:首页 > 其它

Servlet——Session(1)之基础知识

2017-08-22 19:29 274 查看


Session之基础知识

思考两个问题: 

1. 大家在网上买东西,张三和李四他们购买的商品不一样,他们的购物车中显示的商品也不一样,这是怎么实现的? 

2. 不同的用户登录网站后,不管该用户浏览该网站的哪个页面,都可以显示登录人的名字,同样可以随时去查看自己的购物车中的商品,这是怎么实现的?


Session技术

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

当用户打开浏览器,访问某个网站操作session时,服务器就会在服务器的内存为该浏览器分配一个session对象,该session对象被这个浏览器独占。

这个session对象也可以看做是一个容器,session默认存在时间为30min,你可以修改。 

看如下示意图: 




Session可以用来做什么

网上商城中的购物车
保存登录用户的信息
将某些数据放入到Session中,供同一用户的各个页面使用
防止用户非法登录到某个页面!


如何理解Session

session不是特别好理解,你可以把session看做是一容器类似于HashMap,有两列。每一行就是session的一个属性。 

每个属性包含两个部分,一个是该属性的名字(String),另外一个是它的值(Object)
名字String值Object
  
  
那么,如果同一个用户浏览器,向session设置一个属性的时候,如果名字相同,会出现什么情况? 

结论:跟Cookie一样,这个值会更新,会替换为新的值


Session基本使用

得到session
// 返回这个request绑定的session对象,如果没有,则创建一个
HttpSession session = request.getSession();
// 返回这个request绑定的session对象,如果没有,则根据create的值决定是否创建一个
HttpSession session = request.getSession(boolean create)
1
2
3
4
1
2
3
4

2.向session中添加属性
session.setAttribute(String name,Object val);
1
1

3.从s
4000
ession中得到某个属性
String value = session.getAttribute(String name);
1
1

4.从session中删除某个属性
session.removeAttribute(String name);
1
1

可以做如下测试: 

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");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14

从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);
}
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

再从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);
1
2
3
4
5
1
2
3
4
5

之后,我们可以从session对象中取出这个User对象:
// 获取User
User user = (User)session.getAttribute("cat");
1
2
1
2


Session生命周期

session中的属性的默认生命周期是30min,这个默认时间可以通过修改web.xml文件来修改

这样修改: 

1.在Tomcat根目录\conf\web.xml文件中修改:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
1
2
3
1
2
3

这样修改会对所有的web应用生效。 

2.如果只需要对某一个web应用设置,则只需要修改对应web应用的web.xml文件。在这个web.xml文件中添加如上的代码,比如你要设置为10分钟,则添加:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
1
2
3
1
2
3

除了设置默认生命周期之外,最重要的是在程序中设置,调用
setMaxInacttiveInterval(int interval)
,这里的interval是以秒为单位的,而且这个方法设置的是发呆时间,比如你设置的是60秒,那么在这60秒之内如果你没有操作过session,它就会自动删除,如果你操作过,不管是设置属性还是读取属性,它都会从头开始计时。
session.setMaxInactiveInterval(60);
1
1

这个应用很广:比如我们逛购物网站,如果我们登录成功并且一直在操作、浏览网页,那么这个会话(Session)就一直保持,也就是我们一直处于登录状态。而如果我们隔了一段时间没有逛这个网站了,那么再逛的时候就会看到自己是未登录状态,因为会话(Session)已经过期了。

如果重启Tomcat,或者reload自己的web应用,或者关机了,那么web应用的session就会失效,这个结论很明显,因为session是存在于服务器的内存中的。 

另外,我们也可以通过函数来让session失效:
invalidate()
,这个函数清除session,删除一切会话。它通常用于安全退出某个网站。

要注意的是,
invalidate()
函数是清除所有session,如果你只要清除一个单个的属性,那么就要使用
session.removeAttribute()
方法。


Session小结

1.session是存在服务器的内存中的 

2.一个浏览器独享一个session域对象 

3.session中可以存放多个属性 

4.session中可以存放对象 

5.如果session设置的属性存在重名,则会替换为新的值

转载来自:http://blog.csdn.net/gavin_john/article/details/51355292
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: