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. 第3阶段——内核启动分析之make menuconfig内核配置(2)

    目标: 分析make menuconfig内核配置过程 在上1小结中(内核编译试验)讲到了3种不同的配置: (1)通过make menuconfig 直接从头到尾配置.config文件 (2) 通过m ...

  2. 【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析

    这一篇我们将会介绍java中try,catch,finally的用法 以下先给出try,catch用法: try { //需要被检测的异常代码 } catch(Exception e) { //异常处 ...

  3. Java web servers 间是如何实现 session 同步的

     Java web servers 间是如何实现 session 同步的 有一个多月的时间没有更新博客了,今天终于忙里偷闲,可以把近期的收获总结一下. 本文是关于Java web servers 之间 ...

  4. MPLS VPN随堂笔记2

    深入理解ospf 理解MPLS VPN 中对OSPF 层次化设计的补充 supper backbone area 2:理解MPLS VPN 中OSPF 的区域设计概念 3:理解MPLS VPN 中OS ...

  5. Swing-setBounds()用法-入门

    先看API: public void setBounds(Rectangle r) 移动组件并调整其大小,使其符合新的有界矩形 r.由 r.x 和 r.y 指定组件的新位置,由 r.width 和 r ...

  6. 在Python中数据类型转换的注意事项

    在学习Python的过程接触到了数据类型转化这一过程,在实践的过程中我发现了一个小问题,我们在平常的使用中要一定注意 在str型转换成int型的过程中,str内的内容必须是整数不然会报错 如图: 在转 ...

  7. Python[小甲鱼009了不起的分支和循环3]

    for语句语法: for 目标 in 表达式: 循环体 例子1: favourite = 'Idmask' for i in favourite: print(i, end= ' ') 上面的输出结果 ...

  8. php数据库连接及简单操作

    数据库改密码:mysql的控制台mysql console 中文乱码解决方法:原因编码格式不一致1.建立数据库的时候,字符集选择utf-82.修改mysql的配置:在[mysqld]模块下面添加cha ...

  9. 分页复用代码【Page类、JSP显示页面】

    前言 为了复用,记载一些以前写过的工具类.方法 page类 import java.util.List; /** * Created by ozc on 2017/3/1. */ public cla ...

  10. Mysql修改id自增值

    如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数 truncate table 表名 如果想保留之前的记录,从某一id(3356)重新开始 alter table 表名  ...