理解会话中的Cookie和Session对象
会话可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个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如何销毁
- 在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细节
- 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(Nme)和设置值(Value);
- 一个web站点可以给一个web浏览器发送多个Cookie,一个web浏览器也可以存储多个web站点提供的Cookie;
- 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB;
- 如果创建了一个Cookie,并将他发送到浏览器,默认情况下它是一个会话级别的Cookie,即存放在浏览器的缓存中,而当用户退出浏览器后被删除。
注意:删除Cookie时,path必须一致,否则不会删除。
四.HttpSession细节
1.ssion对象被销毁之后,不能在会话中取其内容
代码:
session.invalidate();
//session.getAttribute("")此操作无效,不允许
五.乱码问题
- 在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("你好!大家好!");
}
六.什么样的场景下选用不同的域对象
- 在多个动态web资源中共享信息时,想到使用域对象;
- Context:信息是属于每个客户端共享的,例如访问次序;
- Session:信息是属于每个客户端独享的,例如购物车,用户登录;
- request:信息是属于一次性的内容,例如错误信息,项目中优先使用;
七.Get 和 Post 请求时的转发和重定向
- 转发问题:
1) 在doGet()方法下进行转发时,则转发到的页面代码是doGet()方法下执行的代码;
2) 在doPost()方法下进行转发时,则转发到的页面代码是doPost()方法下执行的代码;
2. 重定向问题:
1) 在doGet()方法下进行重定向时,则重定向到的页面代码是doGet()方法下执行的代码,因为重定向后是由客户端浏览器从新以request()的Get请求头方式请求;
八.会话对象常用的AIP
- 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对象的更多相关文章
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token
本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动 ...
- 第74节:Java中的Cookie和Session
第74节:第74节:Java中的Cookie和Session ServletContext: 什么是ServletContext,有什么用哦,怎么用呢? 启动服务器后,会给每个应用程序创建一个Serv ...
- JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解
Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...
- Django---Django中使用COOKIE和SESSION
Django---Django中使用COOKIE和SESSION 一丶Cookie cookie的由来 # HTTP协议是无状态的. # 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请 ...
- java的会话管理:Cookie和Session
java的会话管理:Cookie和Session 1.什么是会话 此处的是指客户端(浏览器)和服务端之间的数据传输.例如用户登录,购物车等 会话管理就是管理浏览器客户端和服务端之间会话过程产生的会话数 ...
- JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)
1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatche ...
- 简述会话跟踪技术——Cookie和Session
简述会话跟踪技术--Cookie和Session 本篇文章将会简单介绍Cookie和Session的概念和用法 会话跟踪技术 首先我们需要搞清楚会话和会话跟踪的概念: 会话:用户打开浏览器,访问Web ...
- 会话跟踪技术 - Cookie 和 Session 快速上手 + 登陆注册案例
目录 1. 会话跟踪技术概述 2. Cookie 2.1 Cookie的概念和工作流程 2.2 Cookie的基本使用 2.3 Cookie的原理分析 2.4 Cookie的使用细节 2.4.1 Co ...
随机推荐
- 使用WebRTC实现电脑与手机通过浏览器进行视频通话
最近一直在研究WebRTC,做了一个小项目:www.meet58.com,这个项目利用WebRTC.WebSocket可以让各种设备只通过浏览器进行视频聊天,无论是电脑.手机或者是平板.下面就是手机和 ...
- JSON 学习笔记
学习使用json过程随笔: json数组格式 var employees = [ { "firstName":"Bill" , "lastName&q ...
- CLR via C# - 基础拾遗
编译器开关设置 IL代码质量 JIT本地代码质量 /optimize- /debug-(默认设置) 未优化 优化 /optimize- /debug+(full/pdbonly) 未优化 未优化 /o ...
- 关于自定义UICollectionViewLayout的一点个人理解<一>
自定义UICollectionView,主要会用到以下几个方法: - (void)prepareLayout; 第一次加载layout.刷新layout.以及- (BOOL)shouldInvalid ...
- SPOJ 1811 Longest Common Substring (后缀自动机第一题,求两个串的最长公共子串)
题目大意: 给出两个长度小于等于25W的字符串,求它们的最长公共子串. 题目链接:http://www.spoj.com/problems/LCS/ 算法讨论: 二分+哈希, 后缀数组, 后缀自动机. ...
- gradle构建依赖
本地依赖 gradle 作为构建工具,能够很方便的使用本地jar包,以下为使用的代码块. dependencies { //单文件依赖 compile files('libs/android-supp ...
- jQuery源码学习:使用隐藏的new来创建对象
在JQuery源码中发现,JQuery定义一个类,但不用new关键字去创建该类对象,而使用方法调用()方式去创建该对象. 很多时候我们是这样写类,然后使用new创建对象的: function Pers ...
- Android SqLite升级
android开发中,如果大家使用到了sqlite就会牵涉到它的升级问题,因为升级后的表结构可能完全不一样,会有字段的添加或者删除等.. sqlite升级思路: 1:将表A重新命名:例 ...
- 伪静态规则写法RewriteRule-htaccess详细语法使用
一.正则表达式教程伪静态规则写法RewriteRule-htaccess详细语法使用教程分享简单说下:伪静态实际上是利用PHP把当前地址解析成另外一种方法进行访问网站!要学伪静态规则的写法,你必须得懂 ...
- py函数递归
1.从前有座山,山中有座庙,庙里有一个老和尚在讲故事... 2.递归:程序调用自身. 3.形式:在函数定义有直接或间接调用自身. 例如:阶乘: n!= 1 x 2 x 3 x ... x n; 从后身 ...