会话技术(Cookie和Session)
- 引入: Http协议是一种 无状态 的协议。
域模型对象(Servlet )–request,session,servletContext
- request 只能在当前请求中获取到数据
- eg: 开启一个浏览器,一次请求(提交)存储数据后,请求结束存储的数据消失
- session 在当前session存活期间都可以读取到数据
- 暂时理解:客户端A与服务器S的session会话内容只能A,S俩访问,客户端B无法访问,A 与服务器S的内容
- eg:开启一个浏览器,多次请求(提交)存储数据,存储的数据可被访问,直到关闭浏览器为止
- servletContext
- eg: 全局变量。只要Web应用在启动中(服务器不关闭),数据一直存在。存储的数据可被所有用户访问。
Cookie
-
Cookies 定义
-
概念
- 记录一些客户端相关的信息 大小不能超过4kb
-
作用,存储位置
- 在浏览器中,经常涉及到数据交换, 储存在浏览器
-
注意:
- 当第一次创建Cookie的值为空时,则不会创建Cookie
-
常用方法
Cookie cookie=new Cookie(name,value);//创建一个cookie response.addCookie(cookie);//通过响应对象返回给客户端浏览器cookie Cookies cs[]=request.getCookies();//获得所有的cookies 返回值是一个数组
-
-
Cookie的属性
属性名 | 含义 |
---|---|
name | cookie的名字 |
value | 对应name的值 |
path | 表示当前哪个路径 哪个请提可以携带cookie 必须以 / 开头 |
domain | 表示的是域名 指定了哪一些域名是可以访问cookie的 默认是localhost |
comment | 表示当前cookie的说明 注释 |
Secure | 表示当前cookie是否只使用https传输 作用:在一定程度上提高 确定 安全性。 |
isHttpOnly | 表示cookie是否只用于传输 而不被js修改。 |
version | 表示版本 |
Maxage | cookie的生存时间 |
分类:
说明:cookie的生存时间是由 MaxAge 属性决定的
-
临时cookie
MaxAge = -1
-
持久cookie
MaxAge =Integer.MAX_VALUE; 永不过期
MaxAge=60×60×24×7 表示cookie60秒后过期
MaxAge =0 表示立即过期
Cookie作用场景
- 购物车
- 记住密码
拼接Cookie内容时需注意:
Cookie Version 0中,某些特殊的字符(如下),不能作为Cookie的内容
例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号。
Session
- 概念
- 指的是服务器和浏览器之间的 一次会话, 会话指的是多次请求和响应的过程。
session的三种实现方式:
-
基于cookie的实现方式
-
重写url(第一种方式禁用cookie 的情况下
- http://localhost:8080/day1112/testSession;JSESSIONID=3E416CBB052F21BB6340E40574511A78
-
隐藏form表单
-
<form method="" action=""> <input type="hidden" name="JSESSIONID" value="3E416CBB052F21BB6340E40574511A78">
-
Session API
方法名 | 返回值类型 | 意义 |
---|---|---|
request.getSession(true); | HttpSession | session 的获取和创建: true和不写情况下: 1>如果有旧的session就用旧的session 2>如果没有已经存在的session,创建一个新的session false的情况下: 1>没有已经存在的session就返回null 2> 如果有旧的session就用旧的session |
session.setAttribute(“name”, “zs”); | Object | 在session对象中存值 |
session.setMaxInactiveInterval(1800); | void | 设置最大空闲时间设置 0或者负数 表示永不过期 |
session.getMaxInactiveInterval(); | int | 获得session的最大空闲时间 |
session.getCreationTime(); | long | session的创建时间 |
session.getId() | String | 获得session的Id |
session.getLastAccessedTime(); | long | lastAccessedTime |
session.isNew() | boolean | 判断session是否是新建 |
session.invalidate(); | void | session立即失效的方法 |
Session 和 Cookie的比较
Session | Cookie |
---|---|
用户数据保存在服务器端 相对安全 | 用户数据保存在客户端,相对于session不安全 |
数据类型不限 | 数据类型为字符串 |
数据大小不限 | 数据大小4kb |
占用服务器内存 | 占用历览器内存 |
记住密码案例(前端,后台)
- 前端:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
window.onload=function() {
var x=document.cookie;//获取前端Cookie值
//console.log(x);
//if (x=="") console.log(x+"1");
if(x!=null&&x!=""){//判断一下预防报错
var an=x.split("&");//切割Cookie
var u=an[0].trim().substring("user=".length);//字符串截取
var p=an[1].trim();//去掉前后空格
var r=an[2].trim();
//赋值
document.getElementsByTagName("input")[0].value=u;
document.getElementsByTagName("input")[1].value=p;
if(r==1)
document.getElementsByTagName("input")[2].checked=true;
}
}
</script>
</head>
<body>
<fieldset style="width:300px; height: 60px;">
<form action="login" method="get">
用户名:<input type="text" name="user" placeholder="请输入用户名"><br>
密码:<input type="password" name="pwd" placeholder="请输入密码"><br>
<label>
<input type="checkbox" name="rember" value="1" >记住密码
</label>
<input type="submit" value="提交">
</form>
</fieldset>
</body>
</html>
- 后台
package com.team5101.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html:charset=utf-8");
String user = request.getParameter("user");
String pwd = request.getParameter("pwd");
String rem = request.getParameter("rember");
if("bggl".equals(user)&&"123456".equals(pwd)) {
if("1".equals(rem)) {//已勾选记住密码
SetCookie(user,pwd,request,response);
}
else {//未勾
Cookie c=new Cookie("user","");
c.setMaxAge(0);
response.addCookie(c);
}
response.sendRedirect("success.html");
}
else {
response.sendRedirect("login.html");
System.out.println("密码错误");
}
}
public static void SetCookie(String user, String pwd,HttpServletRequest request,HttpServletResponse response) {
String value=user+"&"+pwd+"&1";
CreateCookie(value,response);//cookie覆盖
}
public static void CreateCookie(String value,HttpServletResponse response) {
Cookie c=new Cookie("user",value);
c.setMaxAge(60*60*24*3);//3天
System.out.println("Cookie-创建成功!时效:"+(c.getMaxAge()/3600/24)+"天 ");
response.addCookie(c);
}
}
为什么关闭浏览器session会失效
- session创建方式:
- 因为默认情况下,当getSession()后,session就被被创建。session在创建时,服务器会通过Cookie返回session 的ID给浏览器,之后服务器根据浏览器Cookie里的session的ID来分辨不同用户。
- session失效的原因
- 这种方法返回的cookie是保存在浏览器的内存中,浏览器关闭后内存会被清理,所以在session在关闭浏览器后就失效了。虽然在服务器保存的session会在在有效期后才会被销毁,但是用户的cookie里没有session的ID,服务器就不能判断出当前用户是否是原先的那个用户。
ServletContext
- 含义
域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据。
-
域对象方法
凡是域对象都有如下3个方法:
setAttribute(name,value);
name是String类型,value是Object类型;往域对象里面添加数据,
添加时以key-value形式添加getAttribute(name); 根据指定的key读取域对象里面的数据 removeAttribute(name); 根据指定的key从域对象里面删除数据
核心方法
- getServletContext().getRealPath(path),根据相对路径获取服务器上资源的绝对路径
- getServletContext().getContextPath();获取当前工程名字