<body>
<h3>会话cookie的使用</h3>
<a href="creatCookie">创建并返回cookie对象</a><br>
<a href="setMaxAge">设置cookie的存活时间</a><br>
<a href="setPath">设置cookie的绑定路径</a><br>
<a href="getCookies">获取请求携带的cookie对象</a><br>
<a href="delCookie">删除指定的cookie对象</a><br>
<a href="rem">案例1-记录上次访问时间</a><br>
<h3>会话session的使用</h3>
<a href="createSession">创建session</a><br>
<a href="delSession">手动销毁session</a><br>
<a href="setAttr">向session作用域中设置属性</a><br>
<a href="getAttr">从session作用域中获取属性的值</a>
</body>
Serlet的会话技术主要有cookie和session两种。
一、cookie的概念
1.1 什么是cookie?
浏览器端的会话技术。
1.2 作用
将会话中产生的数据存放在浏览器端。
- cookie存在浏览器上
- cookie由服务器创建
- cookie存放的数据不安全
- cookie存储的数据量不超过4k
- cookie中存放的文本信息(String)
1.3 工作流程
浏览器访问服务器时,服务器生成cookie(键值对形式),通过响应(ser-cookie)返回给浏览器,cookie保存在浏览器上。
1.3 cookie的基本使用
1.3.1 cookie常用的方法介绍
- 创建cookie: new Cookie(String name,String value);
- 获取cookie的名称: String getName()
- 获取cookie的值: String getValue()
- 设置cookie的路径-浏览器根据这个路径判断哪些cookie要发送给服务器: void setPath(String uri)
- 将cookie发送给浏览器: HttpServletResponse: void addCookie(Cookie cookie);
- 获取浏览器发送的cookie: HttpServletRequest: Cookie[ ] getCookies()
- 注意: cookie主要是通过名称和路径来确定他的唯一性。
如果名字一样,但路径不同,两个cookie可以同时存在
如果名称和路径都一样,后者会覆盖前者。
@WebServlet(name = "CreateCookieServlet", urlPatterns = "/creatCookie")
public class CreateCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//response.setContentType("text/html;charset=utf-8");
//创建cookie对象,并返回cookie对象给浏览器保存
//创建cookie对象
Cookie a = new Cookie("akey", "avalue");
Cookie b = new Cookie("bkey", "bvalue");
//将cookie通过响应头set-cookie 返回给浏览器保存
//给set-cookie头设置信息
response.addCookie(a);
response.addCookie(b);
}
1.4 Cookie的分类
- 会话级别的Cookie:默认的,关闭了浏览器Cookie就销毁了。
- 持久级别的Cookie: 可设置指定cookie在浏览器的存活活时间,Cookie就不会随着浏览器的关闭而销毁了。
1.4.1 API介绍
- void setMaxAge(int expiry): 设置cookie的最大生存时间(单位:秒),超过了该时间后Cookie会自动销毁。
- 注意事项: 要删除已经存在的cookie,用来覆盖的cookie的名称与路径必须与原来的cookie保持一致。
@WebServlet(name = "SetMaxAgeServlet", urlPatterns = "/setMaxAge")
public class SetMaxAgeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//设置cookie的存活时间
//创建cookie对象
Cookie c = new Cookie("ckey", "cvalue");
Cookie d = new Cookie("dkey", "dvalue");
//设置cookie的存活时间
c.setMaxAge(10);//秒
d.setMaxAge(3600);
//将cookie通过响应头set- cookie返回给浏览器保存
response.addCookie(c);
response.addCookie(d);
}
- 获取请求携带的cookie对象:
@WebServlet(name = "GetCookiesServlet", urlPatterns = "/getCookies")
public class GetCookiesServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//获取请求携带的cookie对象
Cookie[] cookies = request.getCookies();
if (cookies!=null && cookies.length>0){
for (Cookie cookie: cookies){
System.out.println(cookie.getName()+":"+cookie.getValue());
}
}
}
- 删除指定的cookie对象:
@WebServlet(name = "DelCookieServlet", urlPatterns = "/DelCookieServlet")
public class DelCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//删除指定的cookie对象
//设置同名 同路径的cookie,并返回
Cookie d = new Cookie("dkey", "aaaaaaaa");
//设置存活时间为0
d.setMaxAge(0);
//设置同路径
response.addCookie(d);
}
- 设置cookie的绑定路径:
@WebServlet(name = "SetPathServlet", urlPatterns = "/setPath")
public class SetPathServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//设置cookie的绑定路径
//创建cookie对象
Cookie aa = new Cookie("aakey", "aavalue");
Cookie bb = new Cookie("bbkey", "bbvalue");
//设置cookie的绑定路径
aa.setPath(request.getContextPath()+"aa");
bb.setPath(request.getContextPath()+"bbb");
//返回给浏览器进行保存
response.addCookie(aa);
response.addCookie(bb);
}
1.5 案例:记录用户上一次访问时间
-
案例分析:
-
代码实现
@WebServlet(name = "RemServlet", urlPatterns = "/rem")
public class RemServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//记录上次访问时间
//1.获取请求携带的所有coolie对象
Cookie[] cookies = request.getCookies();
//2.遍历cookie数组,找名称为“lasttime”的cookie对象
Cookie c=null;
if (cookies!=null&&cookies.length>0){
for (Cookie cookie:cookies){
if ("lastTime".equals(cookie.getName())){
c=cookie;
break;
}
}
}
//3.判断是否找没找到cookie对象
if (c==null){
//没找到:第一访问
response.getWriter().print("您是第一次访问,欢迎再来玩儿啊.....");
}else {
//找到: 不是第一次访问
String d = c.getValue();
response.getWriter().print("您上次访问的时间为: "+d);
}
//4.生成本次访问的时间,并将时间返回给浏览器
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
String dateStr = format.format(date);
c = new Cookie("lastTime", dateStr);
//设置绑定路径
c.setPath(request.getContextPath()+"/rem");
//设置存活时间
c.setMaxAge(99999);
//返回给;浏览器保存
response.addCookie(c);
}
1.6 注意事项
在cookie值中,不能使用分号,逗号,空格,如果存在的数据不合法,会报错!
-
如果想要保存非法数据在cookie中,该如何操作?
-
cookie对于基本符号,数字和字母可以保存,将它们编码在解码即可。
-
API介绍:
-
URL Encoder类: static String encode(String s, String enc) 将指定的字符串,按指定的编码表编码 。
-
URLDecoder类: static String decode(String s, String enc) 将指定的字符串,按指定的编码表解码
二、session
2.1 概述
服务器端的会话技术
-
作用:
-
在服务器上存放一次会话中的数据。
-
session 存在服务器上
-
session由服务器创建
-
session中存放的数据相对安全
-
session中存放的数量不受限制
-
session中可以存放一切数据(Object)
2.2 session的应用场景
- 保存购物车数据
- 保存用户浏览记录数据
- 保存用户登录信息数据
- 保存验证码
2.3 session的基本使用
2.3.1 session存储数据与获取数据
2.3.1.1 API介绍
- 创建session空间
//创建session空间
HttpSession session = request.getSession();
- 移除session空间:
@WebServlet(name = "DelSessionServlet", urlPatterns = "/delSession")
public class DelSessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
session.invalidate();
}
- HttpServletRequest
获取session对象: HttpSession getSession();
- HttpSession
void setAttribute(String name,Object value):在session中保存数据
Object getAttribute(String name):从session中获取数据
void removeAttribute(String name):从session中移除数据
- 代码实现1:
@WebServlet(name = "SetAttrServlet", urlPatterns = "/setAttr")
public class SetAttrServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//获取session空间
HttpSession session = request.getSession();
//设置属性
session.setAttribute("skey","svalue");
//获取属性
Object skey = session.getAttribute("skey");
System.out.println("SetAttrServlet:"+skey);
}
- 代码提示2:
@WebServlet(name = "GetAttrServlet", urlPatterns = "/getAttr")
public class GetAttrServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//获取session对象
HttpSession session = request.getSession();
//获取session中的属性值
Object skey = session.getAttribute("skey");
System.out.println("GetAttrServlet"+skey);
//修改
session.setAttribute("skey","777777");
Object skey1 = session.getAttribute("skey");
System.out.println("修改后的值:"+skey1);
//删除
session.removeAttribute("skey");
Object skey2 = session.getAttribute("skey");
System.out.println("删除后的值:"+skey2);
}
2.4 Session生命周期
-
创建:
1. java代码中第一次调用request.getSession()
2. 不懈怠jsessionid但找不到对应的session也会创建 -
销毁:
1. 服务器非正常关闭
2. session超时:tomcat默认超时时间为30分钟
3. 手中销毁:调用session.invalidate()方法
三、三个域对象总结
3.1 ServletContext:
针对一个web应用,一个web应用只有一个ServletContext对象,使用该对象保存的数据在整个web应用中都有效。
- 创建: 服务器启动的时候
- 销毁: 服务器关闭的时候,或者项目移除的时候。
作用:
1. 获取文件mime类型
2. 获取资源在服务器上的完整路径
3. 存放共享的数据
3.2 Session对话
针对一次会话,使用该对象保存数据,一次会话(多次请求)内数据有效。
- 创建: 调用request.getSession()时
- 销毁:
1. 服务器非正常关闭
2. session超时
3. 手动销毁:调用invalidate()方法
作用范围: 一次会话
作用: 存放私有数据
3.3 Request请求
- 生命周期:
创建: 请求来的时候
销毁: 响应生成的时候
作用范围: 一次请求链接
作用: 存放一次请求串中的数据。
3.3 三个作用域对象操作的API
- 存放数据: setAttribute(name,value)
- 获取数据: getAttribute(name)
- 删除数据: removeAttribute(name)