Servlet详解

来源:互联网 发布:看完就毁软件 编辑:程序博客网 时间:2024/05/21 17:46

原文出处:http://blog.csdn.net/q547550831/article/details/50458456

Servlet详解

基本概述

    Session在计算机中,尤其是在网络应用中,称为“会话控制”。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到关闭这个网站所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中可以看到,Session实际上是一个特定的时间概念。

参考文档:http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html

 

Session工作原理图



    Tomcat默认是30分钟。

Tomcat主目录的conf文件夹中的web.xml文件可以进行设置全局默认会话生命周期时间。


3种设置session生命周期的方法

1tomcat/conf/web.xml

    如上图所示,将数字进行更改则行,单位为分钟。

 

2、在web应用下的web.xml

    直接在<web-app></web-app>中加入如图所示代码则行。

 

3、通过request.getSession().setMaxInactiveInterval(time)

    time是以秒为单位的。time为正数表示用户未操作多少秒后会话失效,0为立即失效,负数代表永不失效。

 

PSsession的生命周期的时间是指用户未操作时间,也就是说当用户未操作多少秒后失效。而cookie的生命周期的时间指得是累积的时间,也就说无论用户访问否,只要累积过去了多少秒后就失效了。


案例:

[java] view plain copy
print?
  1. package com.pc;  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4. import java.net.URLDecoder;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9. import javax.servlet.http.HttpSession;  
  10. public class Servlet13 extends HttpServlet {  
  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  12.             throws ServletException, IOException {  
  13.         // 字符编码  
  14.         request.setCharacterEncoding("utf-8");  
  15.         response.setContentType("text/html;charset=utf-8");  
  16.         response.setCharacterEncoding("utf-8");  
  17.         PrintWriter out = response.getWriter();  
  18.   
  19.         // 获取Session  
  20.         HttpSession session = request.getSession();  
  21.   
  22.         // 获取属性  
  23.         String name = (String) session.getAttribute("name");  
  24.         Integer age = (Integer) session.getAttribute("age");  
  25.           
  26.         // 删除name属性  
  27.         //session.removeAttribute("name");  
  28.           
  29.         if (name != null && age != null) {  
  30.             out.println(URLDecoder.decode(name, "utf-8") + " " + age);  
  31.         }  
  32.         out.flush();  
  33.         out.close();  
  34.     }  
  35.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  36.             throws ServletException, IOException {  
  37.         this.doGet(request, response);  
  38.     }  
  39. }

小结

1session存在服务器的内存中

2一个用户浏览器,独享一个session域对象

3session中的属性的默认生命周期是30min ,你可以通过 web.xml来修改

4session中可以存放多个属性

5session 可以存放对象

6如果 request.getSession().setAttribute(name,val) , 如果名字重复,则会替换该属性.

7、生命周期设置优先级顺序为setMaxInactiveInterval > web应用下的web.xml设置 > tomcat/conf/web.xml下的设置

81,2两种方法之所以不能是秒级的一个关键原因是因为太耗费资源,3能是秒级的原因是因为它是对单个Session进行监控。

9session生命周期时间指得是用户未操作时间,当用户访问后,有从新计时,可以采取如下几种方式使session或者其中属性失效。

    1、重启、reload应用、关机,session会完全失效。

    2、通过request.getSession().invalidate()session中所有属性失效。

    3、通过request.getSession().removeAttribute()session中某一属性失效、


Session工作原理更深入的理解

PSJSESSIONIDSession自动生成的用于唯一表示Session对象的一个ID号,通过该ID号服务器可以对每一个浏览器进行标识。


JSESSION控制session销毁时间

    当关闭浏览器之后,因为session默认返回的Cookie是会话级别的,所以即使服务器那端session并没有失效,再打开浏览器也无法使用之前的会话了。不过可以通过重设JSESSIONID这个Cookie来实现有效期持续到session生命周期完。

 

案例:

[java] view plain copy
print?
  1. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.     response.setContentType("text/html;charset=utf-8");  
  3.     PrintWriter out = response.getWriter();  
  4.     HttpSession session = request.getSession();  
  5.     session.setAttribute("name""张三");  
  6.     out.println("创一个session并放入姓名属性");  
  7.     //把该session id保存cookie,在id时,一定要按照规范命名,这里区分大小写  
  8.     Cookie cookie = new Cookie("JSESSIONID", session.getId());  
  9.     cookie.setMaxAge(60*30);  
  10.     response.addCookie(cookie);  
  11. }
[java] view plain copy
print?
  1.     public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {  
  2.     response.setContentType("text/html;charset=utf-8");  
  3.     PrintWriter out = response.getWriter();  
  4.     HttpSession httpSession = request.getSession();  
  5.     String name = (String) httpSession.getAttribute("name");  
  6.     out.println("name = "+name);  
  7. }

Cookie禁用后使用Session的方法

    cookie禁用后可以使用URL重写的方法,来实现Session

基本语法:

response.encodeRedirectURL(java.lang.String url) 

    用于对sendRedirect方法后的url地址进行重写

response.encodeURL(java.lang.String url)

    用于对表单action和超链接的url地址进行重写


encodeURL (String url)方法的实现机制为: 

    先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url,再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。


cookiesession的比较

1存在的位置

    cookie:存在客户端的临时文件夹

    session:存在服务器内存中,一个session域对象为一个用户浏览器服务

2安全性

    cookie:是以明文的方式放在客户端的,安全性弱,可以通过(MD5)加密再存放。

    session:是存放在服务器内存中,所有安全性好

3网络传输

    cookie属性值会传递信息给服务器 

    session:属性值不会给客户端

4生命周期

    cookie的生命周期:是累计时间,即如果我们给cookie设置setMaxAge30),则30秒后失效。

    session的生命周期:是间隔时间,如我们设置session 20min,指在20min内,如果没有访问session,则session失效(session失效是指无法读取session属性),

在以下情况session也会失效

  (1)关闭tomcat  2reload  web应用  (3)时间到  (4) 调用invalidate方法

5、作用范围

    cookie:能够被多个浏览器共享

    session:只能一个浏览器使用

6使用原则

    session因为session会占用服务器的内存,因此不要向session中存放过多过大的对象,会影响性能。

    cookie:不要将太多数据放置在cookie中,这样会使用大量带宽。

 

 

 

----------参考《韩顺平.细说Servlet


0 0