会话可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个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. [转]Laravel 4之数据库操作

    Laravel 4之数据库操作 http://dingjiannan.com/2013/laravel-database/ 数据库配置 Laravel数据库配置在app/config/database ...

  2. input输入字母自动大小写转换

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. DBSNMP和SYSMAN用户初始密码及正确的修改方式

    SYSMAN和DBSNMP跟涉及到Oracle的EM,所以跟其他的用户修改密码方式有所区别. 下面是这两个用户的默认密码和作用说明 DBSNMP DBSNMP The account used by ...

  4. 虚拟化之docker安装篇

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

  5. 触摸点为scrollview上的子控件时,scrollview不能滚动(iOS8)

    现象:在iOS8上,scrollview上面布局了多行多列的button,滑动scrollview,如果当触摸点是在按钮上,scrollview不能滚动. 例如: 解决方法:设置scrollview的 ...

  6. Entity Framework中实现查询的几种方法

    在介绍几种方法前,献上一张图,希望图的作者不要追究我的盗图之过.本文的内容是我自学时的笔记,自学的内容来自网络.手打的代码,切不可直接复制过去用,会有好多错别字什么的. Entity SQL 类似于S ...

  7. SELECT TOP column FROM table [ORDER BY column [DESC]]

    如果想返问表中行的子集,仅需要返回特定数量的记录,而不管符合条件的行有多少.要返回排在前面的值,可以有两个选择:指定固定数量的行,或者指定总行数的百分比.SQL Server不对这些数据做任何分析,共 ...

  8. (转)Java程序利用main函数中args参数实现参数的传递

    Java程序利用main函数中args参数实现参数的传递 1.运行Java程序的同时,可以通过输入参数给main函数中的接收参数数组args[],供程序内部使用!即当你在Java命令行后面带上参数,J ...

  9. InetAddress类的使用

    1.1. 简介 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetAddress是Java对IP地址的封装,在java.net中有 ...

  10. C语言程序的结构分析

    一个C语言源程序可以由一个或多个源文件组成. 每个源文件可由一个或多个函数组成. 一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数. 源程序中可以有预处理命令(include ...