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

来源:互联网 发布:网络交换机类型的杂志 编辑:程序博客网 时间:2024/06/14 08:37

Session之基础知识

思考两个问题: 
1. 大家在网上买东西,张三和李四他们购买的商品不一样,他们的购物车中显示的商品也不一样,这是怎么实现的? 
2. 不同的用户登录网站后,不管该用户浏览该网站的哪个页面,都可以显示登录人的名字,同样可以随时去查看自己的购物车中的商品,这是怎么实现的?

Session技术

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

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

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

Session可以用来做什么

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

如何理解Session

session不是特别好理解,你可以把session看做是一容器类似于HashMap,有两列。每一行就是session的一个属性。 
每个属性包含两个部分,一个是该属性的名字(String),另外一个是它的值(Object)

名字String值Object    

那么,如果同一个用户浏览器,向session设置一个属性的时候,如果名字相同,会出现什么情况? 
结论:跟Cookie一样,这个值会更新,会替换为新的值

Session基本使用

  1. 得到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.从session中得到某个属性

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,可以看到结果: 
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,可以看到结果: 
Servlet2运行结果

这是在同一个浏览器中打开的两个不同的标签页,那么如果我们换一个浏览器呢,比如换成MicroSoft Edge浏览器: 
Edge浏览器运行Servlet2结果

可以看到这时候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对象:

// 获取UserUser 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