会话可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

在java语言中,Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求,其中这个过程,保存会话中数据的两种重要技术:

1.Cookie技术:

Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器,并保存在客户端浏览器的缓存中。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

2.Session技术:

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

一.HttpSession原理

Cookie和Session都能维护web客户端和web服务端的会话。

1.  什么是HttpSession

1)  HttpSession属于服务端技术;

2)  在Servlet中,产生唯一的会话,必须通过request.getSession()才行,重新打开新的IE,会产生新的Session会话;

3)  在转发和重定向的情况下,多个Servlet中共享同一个HttpSession;

4)  同一个代码request.getSession(),但可能含义不同,其一是代表创建新的会话,其二是取得原有的会话;

2.  HttpSession原理

1)  会话底层是基于Cookie的;

2)  客户端发送请求头:Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E

3)  服务端发送响应头:Set-Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E; Path=/day08

因此,对于会话而言,通过JSESSIONID来维护客户端和服务端的状态;

4)  通过手工向客户端写入Cookie来达到多个浏览器共享会话的情况;

5)  确保浏览器能禁止Cookie成功,当Cookie被禁用,可以使用URL重写来维护客户端和服务端的状态;

6)  会话在服务端默认有效期为30分钟;

7)  如果有这样的错误:Session already invalidated:

则表示在无效的会话中取值,此时会话并没有销毁,只是内容被清空而已;

8)  当浏览器阻止Cookie写入浏览器,可以使用URL重写;

二.HttpSession如何销毁

  1. 在web.xml文件中配置过期时间,单位为分,Cookie生命周期时间单位是:秒;
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<session-config>
<session-timeout>1</session-timeout>
</session-config>
</web-app>

2.   通过HttpSession.invalidate()将当前会话设置为无效;

3.   web服务器shutdown时,即销毁HttpSession;

4.   重新部署新的web应用。

注意:关闭浏览器,在默认情况下,会话不会销毁。

三.Cookie细节

  1. 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(Nme)和设置值(Value);
  2. 一个web站点可以给一个web浏览器发送多个Cookie,一个web浏览器也可以存储多个web站点提供的Cookie;
  3. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB;
  4. 如果创建了一个Cookie,并将他发送到浏览器,默认情况下它是一个会话级别的Cookie,即存放在浏览器的缓存中,而当用户退出浏览器后被删除。

注意:删除Cookie时,path必须一致,否则不会删除。

四.HttpSession细节

1.ssion对象被销毁之后,不能在会话中取其内容

代码:

session.invalidate();

//session.getAttribute("")此操作无效,不允许

五.乱码问题

  1. 在Servlet中,以字节方式输出给浏览器时:

ServletOutputStream以本地平台方法自动编码和解码,以解决中文输出问题,即用户不需要设置编码方法,ServletOutputStream已解决。

代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletOutputStream sout = response.getOutputStream();
sout.write("你好!".getBytes());

或者,用户可以自定义编码和解码方式,也可以解决中文输出问题。

代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
ServletOutputStream sout = response.getOutputStream();
sout.write("大家好!".getBytes("UTF-8")); }

2.   在Servlet中,以字符方式输出给浏览器时:需要在Servlet代码中设置服务端的编码方式和客户端的编码方式一致。

代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//以字符方式输出中文
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.write("你好!大家好!");
}

六.什么样的场景下选用不同的域对象

  1. 在多个动态web资源中共享信息时,想到使用域对象;
  2. Context:信息是属于每个客户端共享的,例如访问次序;
  3. Session:信息是属于每个客户端独享的,例如购物车,用户登录;
  4. request:信息是属于一次性的内容,例如错误信息,项目中优先使用;

七.Get 和 Post 请求时的转发和重定向

  1. 转发问题:

1)  在doGet()方法下进行转发时,则转发到的页面代码是doGet()方法下执行的代码;

2)  在doPost()方法下进行转发时,则转发到的页面代码是doPost()方法下执行的代码;

2.   重定向问题:

1)  在doGet()方法下进行重定向时,则重定向到的页面代码是doGet()方法下执行的代码,因为重定向后是由客户端浏览器从新以request()的Get请求头方式请求;

八.会话对象常用的AIP

  1. Cookie对象
Cookie cookie = new Cookie("name","xiaoming");
System.out.println(cookie.getName());//输出name
System.out.println(cookie.getValue());//输出name对应的值,即xiaoming
cookie.setMaxAge(60);//设定这个cookie的最长存活时期,单位:秒
int time = cookie.getMaxAge();//返回这个cookie指定的最长存活时期

2.   Session对象

//有两层含义,其一是创建新的session会话,其二是得到该web客户端对应的会话
HttpSession session = request.getSession();
session.getId()//获取session的ID
session.isNew()//判断其是否新旧
session.setAttribute("name", "xiaoming");//绑定域中的信息
String name = (String)session.getAttribute("name");//获取域中指定绑定的信息
Long time = session.getLastAccessedTime();//获取会话最后的请求时间
session.invalidate()//终止这个session。所有绑定在这个session上的数据都会被清除。

理解会话中的Cookie和Session对象的更多相关文章

  1. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  2. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动 ...

  3. 第74节:Java中的Cookie和Session

    第74节:第74节:Java中的Cookie和Session ServletContext: 什么是ServletContext,有什么用哦,怎么用呢? 启动服务器后,会给每个应用程序创建一个Serv ...

  4. JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解

    Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...

  5. Django---Django中使用COOKIE和SESSION

    Django---Django中使用COOKIE和SESSION 一丶Cookie cookie的由来 # HTTP协议是无状态的. # 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请 ...

  6. java的会话管理:Cookie和Session

    java的会话管理:Cookie和Session 1.什么是会话 此处的是指客户端(浏览器)和服务端之间的数据传输.例如用户登录,购物车等 会话管理就是管理浏览器客户端和服务端之间会话过程产生的会话数 ...

  7. JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)

    1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatche ...

  8. 简述会话跟踪技术——Cookie和Session

    简述会话跟踪技术--Cookie和Session 本篇文章将会简单介绍Cookie和Session的概念和用法 会话跟踪技术 首先我们需要搞清楚会话和会话跟踪的概念: 会话:用户打开浏览器,访问Web ...

  9. 会话跟踪技术 - Cookie 和 Session 快速上手 + 登陆注册案例

    目录 1. 会话跟踪技术概述 2. Cookie 2.1 Cookie的概念和工作流程 2.2 Cookie的基本使用 2.3 Cookie的原理分析 2.4 Cookie的使用细节 2.4.1 Co ...

随机推荐

  1. 虚拟化之docker安装篇

    1,docker pull centos     下载centos镜像 docker search centos  搜索镜像 2,docker images           查看本地镜像 3,do ...

  2. javascript 多图无缝切换

    思路只要是ul移动前,首先将当前显示的li克隆岛ul最后,当每次运动执行完毕后,再将前面的li删除,如此循环. <!DOCTYPE html> <html> <head& ...

  3. win7 AnkhSVN 安装报错

    重装系统后,需要安装AnkhSVN,结果一直报如下错误 An error occurred during the installation of assembly"Microsoft.VC8 ...

  4. js如何关闭当前页,而不弹出提示框

    //关闭当前页面,并且打开新页面,(不提示) function closeWinAndOpen(url) { //利用随机数处理WinName var sWinName = "LR" ...

  5. ADO.NET程序访问数据的组件

    组成--数据集(内存中的数据库) --DataSet数据集 --DataTable数据表 --DataColumn数据列 --DataRow数据行 --DataView数据视图--NET数据提供程序 ...

  6. PHP学习笔记二十【静态方法】

    <?php //静态变量的基本用法 //1,在类中定义变量 //2.定义方式[访问修饰符]static 变量名 //3.访问方式self::$变量名 第二种方式,类名::$变量名 //4.在类外 ...

  7. 在[self addsubView:xxx]中,self.name 和 _name的区别

    在[self addsubView:xxx]中,self.name 和 _name的区别self.name 会调用重写的getter方法,而_name添加的只是_name 这个成员变量

  8. xcode 7 添加空模板

    文件下载链接: http://pan.baidu.com/s/1pKbyf4R 密码: ppi7 下载完成后将模板放入以下路径应用程序->Xcode->右键显示包内容->/Conte ...

  9. shell中的expr命令

    expr 可以进行的操作如下: 逻辑操作 arg1 | arg2 逻辑或操作,真则返回arg1,否则返回arg2(以null或者0来判断参数的真假,有短路功能) arg1 & arg2 逻辑与 ...

  10. [置顶] 【C/C++学习】之十三、虚函数剖析

    所谓虚函数,虚就虚在“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的.由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被称为“ ...