Cookie和HttpSession

什么是会话:

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

每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据,以便为客户提供更多的服务。

例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。

思考:用户购买的商品保存在request或servletContext中行不行?

所以,会话要解决的问题是如果保存会话过程中产生的数据。

会话管理技术:cookie技术和session技术

一.Cookie技术

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

1.Cookie产生流程图:

2.Cookie:(cookie中不能有中文)

Cookie包含的就是会话过程产生数据的各种属性。

Cookie的属性:

name:名称,必须的。

value:内容,必须的。

comment:注释,可选的。

path:所属路径,可选的。

默认的path是写cookie的那个资源的访问路径URI

如:向客户端写cookie的资源访问地址是:

http://localhost:8080/day06/servlet/CookieDemo1

那么该cookie的默认path是:

/day06/servlet

domain:表示访问资源的域名(itcast.cn)可选的。默认的域名是写cookie的那个资源所在的域

maxAge:用于设置cookie的生命周期,可选的。cookie的默认生命周期是一次会话期。把最大存活时间改为0,就代表要删除该cookie。

version:版本号,可选的。

secure:是否是HTTPS安全协议。

3.如何唯一确定一个Cookie

就是通过domain+path+name来确定唯一性的。

当访问一个网站的资源时,会产生cookie,当又访问这个网站的其他资源时,如果产生的这个cookie的domain+path和访问这个资源的域名+路径(/*)相同时,就会带这个cookie去访问这个资源。

访问资源:itheima.com/servlet/ServletDemo1

产生的一个cookie:itheima.com+/servlet+cname

那么访问下列哪些资源会带着这个cookie去访问:

itheima.com/ServletDemo2:不带

itheima.com/servlet/ServletDemo3:带

又产生一个新的cookie:itheima.com/day06/cookie的name

访问资源:itheima.com/ServletDemo2:不带

访问资源:itheima.com/day06/ServletDemo2:带

访问资源:itheima.com/day06/servlet/ServletDemo2:带

访问资源:itheima.com/day06/*:带

4.Cookie类

javax.servlet.http.Cookie类用于创建一个Cookie,response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。

Cookie类的方法:

public Cookie(String name,String value)

setValue    getValue

setMaxAge与getMaxAge

setPath与getPath

setDomain与getDomain

getName方法

服务器如何向客户端写Cookie

演示代码如下:

Cookie c = new Cookie("name","value");

response.addCookie(Cookie c):

或者通过向客服端写一个Set-Cookie响应消息头,与上面的效果是一样的

response.setHeader("Set-Cookie","name=value");

服务器如何得到客户端传递过来的Cookie:

Cookie[] cs = request.getCookies()

然后根据名称进行遍历

注意:

一个网站只能向客户端写20个Cookie。客户端最多存放300个Cookie。每一个Cookie的大小不能超过4KB。

如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要调用maxAge()方法,并传入一个以秒为单位的时间值参数。将最大时效设为0则是命令浏览器删除该cookie。

删除cookie时,path必须一致,否则不会删除。

代码演示:

演示一:显示访问某一资源的时间,用cookie保存时间数据。

演示二:用户名户密码成功登陆后,勾选记住用户名选项,下次访问不需要填写用户名,用cookie进行保存数据

演示三:访问一个电商网站,查看一系列商品后,会有最近时间段访问的商品名称列表,最近访问的商品会在最前端,最多不超过3个商品列表,用cookie保存数据。

二.HttpSession技术

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

1.HttpSession产生流程图:

V76

2.HttpSession也是一个域对象

常用方法:

Object getAttribute(String name)

void setAttribute(String name,Object obj)

void removeAttribute(String name)

如何获取HttpSession对象

request.getSession():如果服务器的内存中有为您服务的session,该方法是获取;如果没有为您服务的session,该方法是创建。

HttpSession.getId():服务器会为每一个session对象分配一个随机的唯一的ID。session技术实际上就是借助了cookie技术。服务器写的这个cookie的名称为"JSESSIONID",取值为session对象的id,path为当前应用,默认生命周期为一次会话。服务器内存中的session对象的超过30分钟后自动销毁。

HttpServletRequest.getSession(boolean create):如果参数为true,作用等同于getSession();如果为false,只会查询,查不到返回null。

long HttpSession.getLastAccessedTime():获取最后一次访问该session对象的时间。

void HttpSession.invalidate():立刻摧毁该session对象

Session工作原理详解图:

代码演示1:用户浏览商品信息使用session进行保存案例

代码演示2: 防止用户表单重复提交案例

3.如果用户禁用了cookie功能,如果解决?

方法一:通过将所有url地址进行重写

基本代码:String newURL = response.encoding(String url);

如果url= http://localhost:8080/session/servlet/ShowCartServlet

重写url后得到的

newURL=http://localhost:8080/session/servlet/ShowCartServlet;JSESSIONID=E2W3E3220D

方法二:通过判断用户是否已经禁用了cookie功能,如果禁用了就提醒用户开启cookie功能。

演示代码:String cookie = request.getHeader(“Cookie”);

if(cookie==null)<--->说明禁用了Cookie,向客户提醒开启Cookie

4.HttpSession对象的生命周期(状态转换)

配置session对象的超时时间

修改当前应用的web.xml配置文件

<session-config>

<session-timeout>1</session-timeout><!--单位是分钟,必须自然数-->

</session-config>

要想将HttpSession对象持久化,就要将存储到其中的对象实现Serializable标记接口

5.如何向Cookie中写入中文数据?

案例:在用户进行用户名登录时,选择了”记住用户名”的功能。这就可以将用户名作为cookie的value,然后将cookie写回浏览器。但用户名有可能是中文,如果是中文写入到Cookie中去时服务器就报错(500响应码)。这时就应该将要保存到cookie中的数据进行BASE64 Encoder编码。当从cookie中获取这个数据时进行 BASE64 Decoder编码即可。

基本代码演示:

将数据进行BASE64Encoder,得到的是新的字符串。

String name = request.getParamter(“name”);

name = new BASE64Encoder().encode(name.getBytes());

将数据进行还原,重新得到想要的数据

String name = new String(new BASE64Decoder().decodeBuffer(name));

注意:导包不要导错

BASE64Encoder:import sun.misc.BASE64Encoder

BASE64Decoder: import sun.misc.BASE64Decoder

java web Servlet 学习笔记 -3 会话管理技术的更多相关文章

  1. java web Servlet学习笔记-2 请求重定向和请求转发的区别

    请求转发与请求重定向的区别 请求重定向和转发 1.请求重定向:浏览器的行为(通过响应对象HttpServletResponse来执行) 特点:可以重新定向访问其他Web应用下的资源 浏览器发出了2次请 ...

  2. java Web Servlet学习笔记-1 HttpServletQequest对象的学习

     HttpServletQequest对象的学习 HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求 ...

  3. java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象

     JSP学习笔记 1.什么是jsp JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP/Servlet规范.JS ...

  4. jsp/servlet学习三之会话管理初解

    由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...

  5. java web(学习笔记)项目路径问题

    最近刚接触java web特别是是关于项目路径这一块很晕,就把自己遇到的一些疑惑和理解写下来. 首先贴上路径,这里用的是eclipse. 其中我们要注意看WebContent目录,这是web程序的根目 ...

  6. 《深入理解java虚拟机》学习笔记之编译优化技术

    郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释 ...

  7. Java Web Service 学习笔记

    一.服务端 1. 创建Java工程 2. 创建接口HostipalServiceInterface package ws_server; import javax.jws.WebMethod; imp ...

  8. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  9. 【Java Web开发学习】Spring MVC添加自定义Servlet、Filter、Listener

    [Java Web开发学习]Spring MVC添加自定义Servlet.Filter.Listener 转载:https://www.cnblogs.com/yangchongxing/p/9968 ...

随机推荐

  1. java常见面试题(一)

    一.Spring面试的问题 1.spring的事务认识 事务注解方式: @Transactional,当标于类前时,该类的所有public方法都进行事物处理. 事务的传播行为: @Transactio ...

  2. Linux-mknod命令(9)

    mknod命令用于创建字符设备文件和块设备文件 (ls /dev -l 结果显示b开头和c开头的,即标识了块设备和字符设备.) 为了管理设备,所以设备中都有两个设备号:  主设备号:为了区分不同类型的 ...

  3. IOS学习【前言】

    2016-1-14 16年开始时导师安排任务,开始IOS学习之旅  经过几天的学习,感觉还是需要作比较多的学习笔记,因此开始用博客记录整个过程,方便以后查看学习与分享. 主要记录一些关键的问题处理方法 ...

  4. Javascript学习日志(三):闭包

    说实话,前面一节的原型和原型链在当初学的时候并没有很头疼,对着高级编程第三版撸了几遍就理解透了,闭包这一节真的挺头疼的,很惭愧,看了差不多十来遍吧,还翻看了网上的其他博客和解释文档,五花八门的表达方式 ...

  5. 设计模式-单体模式(C++)

    设计模式-单体模式 单体模式在使用非常方便,适合于单一的对象,例如全局对象的抽象使用. 需要注意的是单体模式不可继承 // 实现 Singleton.h #ifndef __SINGLETON_H__ ...

  6. 【Alpha阶段】第三次scrum meeting

    每日任务: ·1.本次会议为第三次Meeting会议: ·2.本次会议于今日上午08:30第五社区五号楼下召开,会议时长15min. 二.每个人的工作: 三.工作中遇到的困难: 由于对编程语言的学习不 ...

  7. 201521123105 第8周Java学习总结

    1.本周学习总结 1.1思维导图 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 1.删除元素的时候从最后一个元素开始,避免删除元素后位置发生变化而导致 ...

  8. 201521123030 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4 ...

  9. 201521123122 《java程序设计》 第六周实验总结

    201521123122 <java程序设计>第六周实验总结 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想 ...

  10. 201521123067 《Java程序设计》第11周学习总结

    201521123067 <Java程序设计>第11周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线 ...