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的生命周期的时间指得是累积的时间。也就说不管用户訪问否。仅仅要累积过去了多少秒后就失效了。

案例:

package com.pc;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class Servlet12 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 字符编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter(); // 訪问session [当发现没用session时,就会自己主动创建session]
HttpSession session = request.getSession(); // 给该session放入属性。能够增加对象
String val = URLEncoder.encode("张三", "utf-8");
session.setAttribute("name", val);
session.setAttribute("age", 20); // session的生命周期(默认30min,能够改动)
// time指的是等待时间,假设超过这个时间,则会自己主动释放该会话
// session.setMaxInactiveInterval(time); out.println("创建session并放入属性");
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
package com.pc;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class Servlet13 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 字符编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter(); // 获取Session
HttpSession session = request.getSession(); // 获取属性
String name = (String) session.getAttribute("name");
Integer age = (Integer) session.getAttribute("age"); // 删除name属性
//session.removeAttribute("name"); if (name != null && age != null) {
out.println(URLDecoder.decode(name, "utf-8") + " " + age);
}
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}

小结

1、session存在于server的内存中

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下的设置

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

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

1、重新启动、reload应用、关机。session会全然失效。

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

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

Session工作原理更深入的理解

PS:JSESSIONID是Session自己主动生成的用于唯一表示Session对象的一个ID号,通过该ID号server能够对每个浏览器进行标识。

JSESSION控制session销毁时间

当关闭浏览器之后,由于session默认返回的Cookie是会话级别的,所以即使server那端session并没有失效,再打开浏览器也无法使用之前的会话了。

只是能够通过重设JSESSIONID这个Cookie来实现有效期持续到session生命周期完。

案例:

	public void doGet(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("name", "张三");
out.println("创一个session并放入姓名属性");
//把该session id保存cookie,在id时。一定要依照规范命名,这里区分大写和小写
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*30);
response.addCookie(cookie);
}
		public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession httpSession = request.getSession();
String name = (String) httpSession.getAttribute("name");
out.println("name = "+name);
}

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,再推断client浏览器是否支持 Cookie,假设支持 Cookie,直接返回參数 url。假设不支持 Cookie。就在參数 url 中增加 Session ID 信息。然后返回改动后的 url。

cookie与session的比較

1、存在的位置

cookie:存在client的暂时目录

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

2、安全性

cookie:是以明文的方式放在client的,安全性弱。能够通过(MD5)加密再存放。

session:是存放在server内存中。全部安全性好

3、网络传输

cookie:属性值会传递信息给server

session:属性值不会给client

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会占用server的内存,因此不要向session中存放过多过大的对象。会影响性能。

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

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

Servlet具体解释的更多相关文章

  1. CGI/MIME/servlet术语解释

    CGI→一种协议, 一种标准, 一种规范 使用CGI协议, 能够让用户访问某些动态资源的时候, 触发web服务器, 让web服务器根据CGI协议能够调用外部(web服务器外部)的程序来执行处理这个动态 ...

  2. Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet具体解释、Servlet的生命周期(2)

    三.Servlet的生命周期 一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet怎样被加载并被初始化,怎样接收请求并作出对请求的响应,怎样被从服务中清除.Servlet ...

  3. JSP是Servlet详解

    前言:前一段时间写了好多Servlet和JSP相关的博客,自以为理解的差不多了,岂不知人外有人,天外有天,代码外还有源码,受高人点拨,看了一下Servlet源码,感触颇深,再也不敢说懂了,不明白生活的 ...

  4. javaweb回顾第五篇浅谈会话

    1:什么是会话 通俗来说就是客户和服务器的一次私密谈话,客户发送请求以后服务器能够识别请求是来自同一个客户,他们是1对1的关系. 了解会话以后我们就要去考虑如何去实现这些问题下面一一进行解析 2:会话 ...

  5. 深入了解 Dojo 的服务器推送技术

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  6. Tomcat架构解析(三)-----Engine、host、context解析以及web应用加载

    上一篇博文介绍了Server的创建,在Server创建完之后,就进入到Engine的创建过程,如下: 一.Engine的创建   1.创建Engine实例 当前次栈顶元素为Service对象,通过Se ...

  7. 着重基础之—Spring Boot 编写自己的过滤器

    Spring Boot 编写自己的"过滤器" 又好久没有写博客进行总结了,说实话,就是 "懒",懒得总结,懒得动.之所以写这篇博客,是因为最近对接公司SSO服务的时候,需要自定义拦 ...

  8. Java Web程序设计笔记 • 【第8章 会话跟踪技术进阶】

    全部章节   >>>> 本章目录 8.1 Session机制 8.1.1 Session 简介 8.1.2 创建 HttpSession 实例 8.1.3 HttpSesiso ...

  9. Tom_No_02 Servlet向流中打印内容,之后在调用finsihResponse,调用上是先发送了body,后发送Header的解释

    上次在培训班学上网课的时候就发现了这个问题,一直没有解决,昨天又碰到了,2-3小时也未能发现点端倪,今早又仔细缕了下,让我看了他的秘密 1.Servlet向流中打印内容,之后在调用finsihResp ...

随机推荐

  1. 1044 - Access denied for user 'root'@'%' to database 'xahy-blog'

    grant 创建了一个远程连接 root 权限账户, 准备再授权个对应数据库操作的账户时出现了 1044 错误. [SQL]grant all privileges on xahy-blog.* to ...

  2. 多任务-进程之进程池Pool

    1.什么是池? 首先从字面上看,池代表着一个容器,用来承载着某些内容的容器,了解到这里,就对进程池有了一个初步的轮廓. 2.什么是进程池Pool? (1)利用现实中的事物来理解: 对于小白初学者,接触 ...

  3. 被我忽略许久的set

    心塞,set一直是我忽略的一个数据结构 1.生成一个set: 1) set(iterable) 传入一个可以迭代的数据结构: eg:字符串;元组;列表,字典 2) {v1,v2,.......,vn} ...

  4. [CTSC2007][APIO2007]数据备份Backup

    题目:BZOJ1150.codevs1615.洛谷P3620 题目大意:有n个点,k条链,每个点离原点有一定的距离.要你用k条链连接2k个点,使得k条链的长度最短. 解题思路:毕竟是CTSC级别的题目 ...

  5. yum-config-manager --add-repo=

    [root@server0 yum.repos.d]# yum-config-manager --add-repo=ftp://192.168.31.121/centos7u4Loaded plugi ...

  6. MHA搭建及故障维护

    MHA是一种方便简单可靠的MySQL高可用架构,具体的介绍我在这里就不多说了,下面是我在网上找的一个教程,我在此基础上进行了一些修改: 大致步骤 (一).环境介绍 (二).用ssh-keygen实现四 ...

  7. SpringBoot实战(四)获取接口请求中的参数(@PathVariable,@RequestParam,@RequestBody)

    上一篇SpringBoot实战(二)Restful风格API接口中写了一个控制器,获取了前端请求的参数,现在我们就参数的获取与校验做一个介绍: 一:获取参数 SpringBoot提供的获取参数注解包括 ...

  8. C/C++ ShellExecuteEx调用exe可执行文件

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49591995 以商业的软件Enblen ...

  9. 洛谷 P2818 天使的起誓

    P2818 天使的起誓 题目描述 Tenshi非常幸运地被选为掌管智慧之匙的天使.在正式任职之前,她必须和其他新当选的天使一样要宣誓.宣誓仪式是每位天使各自表述自己的使命,他们的发言稿放在n个呈圆形排 ...

  10. Codeforces 558E 线段树处理字符串内排序

    给出长度为n的字符串,m个操作. 每一个操作有三个值 l,r,op. op==1,表示将字符串中[ l ,r ]的部分依照升序排列. op==0,表示将字符串中[ l ,r ]的部分依照降序排列. 输 ...