原文出处: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生命周期的方法

1、tomcat/conf/web.xml

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

2、在web应用下的web.xml

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

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

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

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

案例:

  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. // 获取Session
  19. HttpSession session = request.getSession();
  20. // 获取属性
  21. String name = (String) session.getAttribute("name");
  22. Integer age = (Integer) session.getAttribute("age");
  23. // 删除name属性
  24. //session.removeAttribute("name");
  25. if (name != null && age != null) {
  26. out.println(URLDecoder.decode(name, "utf-8") + " " + age);
  27. }
  28. out.flush();
  29. out.close();
  30. }
  31. public void doPost(HttpServletRequest request, HttpServletResponse response)
  32. throws ServletException, IOException {
  33. this.doGet(request, response);
  34. }
  35. }

小结

1、session存在于服务器的内存中

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

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

4、session中可以存放多个属性

5、session 可以存放对象

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

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

能是秒级的原因是因为它是对单个Session进行监控。

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

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

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

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

Session工作原理更深入的理解

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

JSESSION控制session销毁时间

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

案例:

  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. }
  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。

cookie与session的比较

1、存在的位置

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

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

2、安全性

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

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

3、网络传输

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

session:属性值不会给客户端

4、生命周期

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

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

在以下情况session也会失效

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

5、作用范围

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

session:只能一个浏览器使用

6、使用原则

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

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

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

Servlet详解的更多相关文章

  1. Java Servlet详解(体系结构+注解配置+生命周期)

    Java Servlet详解(注解配置+生命周期) 什么是Servlet : (Server applet)? 顾名思义:服务端的小程序 Servlet只是一个接口,定义了Java被浏览器访问到(To ...

  2. Java Web(一) Servlet详解!!

    这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...

  3. (转)Java Web(一) Servlet详解!!

    https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...

  4. web开发(一)-Servlet详解

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6399262.html>,在此仅供学习参考之用. 一.什么 ...

  5. Servlet 详解

    1.什么是 Servlet? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序 ...

  6. JavaWeb笔记一、Servlet 详解

    一.创建一个 Servlet 简单实现类 1.创建一个 HelloServlet 类(测试 Servlet 接口方法) 1 //创建一个 HelloServlet 类并实现 Servlet 接口 2 ...

  7. jsp/servlet学习二之servlet详解

    Servlet API概览 Servlet API有一下四个java包: 1,javax.servlet,其中包含定义servlet和servlet容器之间契约的类和接口. 2,javax.servl ...

  8. Java Web(二) Servlet详解

    什么是Servlet? Servlet是运行在Web服务器中的Java程序.Servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求.Java Web应用程序中所有的请求-响应 ...

  9. 04_web基础(四)之servlet详解

    16.17.18.servlet生命周期 javax.servlet.Servlet接口方法:public String getServletInfo():获取Servlet相关信息(作者,版权,版本 ...

随机推荐

  1. html5的116个标签

    基础   标签 描述 <!DOCTYPE> 定义文档类型. <html> 定义 HTML 文档. <title> 定义文档的标题. <body> 定义文 ...

  2. 【Time系列一】datetime的妙用

    今天在弄个自动关机小脚本的时候,遇到了时间转换的问题,也难怪,以前没学过, 不能怪我不会哦! 首先,先学会打印出当前时间的几种方式 参考开源社区:  http://my.oschina.net/u/1 ...

  3. scala实现快速排序

    scala> def qSort(a: List[Int]): List[Int] = { | ) a | else qSort( a.filter(a.head > _ )) ++ | ...

  4. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

  5. 关于ajax跨域问题

    什么是跨域 1.document.domain+iframe的设置 2.动态创建script 3.利用iframe和location.hash 4.window.name实现的跨域数据传输 5.使用H ...

  6. JavaFX基础学习之OkHttp/Gson2

    222 package application; import java.io.IOException; import java.net.URL; import java.util.ResourceB ...

  7. Linux常用命令汇总及使用方法(二)之文本编辑器VI

    VI可能是在Linux中使用比较频繁的文本编辑器,如果不能熟练使用VI,在一定程度上会影响工作效率,所以在这里记录一下VI的常用命令及操作方式 在[root@test ~]# vi carrie.tx ...

  8. JAVA中String(字符串)课堂总结

    一:Java编译器中关于字符串自动优化 例子一: 源代码: public class StringPool { public static void main(String args[]) { Str ...

  9. 如何获取本机IP

    GetLocalHost 直接通过InetAddress.getLocalHost()来获取,其主要逻辑如下 InetAddress.getLocalHost(): String hostname = ...

  10. Spring 上传文件

    最近碰到一个上传文件的需求,其实之前也做过但是都是search->copy 没有细究过,这次纯手工. 先看一下需要依赖的包: <dependency> <groupId> ...