会话: 把同一个浏览器与WEB服务器的一次一系列的各种交互活动称之为"会话"。
对会话过程进行跟踪:每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,我们需要对用户的会话进行跟踪,需要记录用户的状态时,程序要想办法为每个用户保存这些数据。
存会话数据的两种技术:Cookie 和 Session
Session与Cookie的区别:session与cookie都可以用来跟踪用户
1)session是保存在服务器端;cookie是保存在客户端
2)一个网站能够写入到客户端的cookie数据是有限制;session的保存数据量是无限制
3)session相对安全;cookie不安全
二、CookieCookie是客户端技术,程序把每个用户的数据以Cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的Cookie数据,这样,web资源处理的就是用户各自的数据了。
Java提供的操作Cookie的API:
Java中把Cookie封装成了 javax.servlet.http.Cookie 类。每个Cookie都是该Cookie类的对象。
服务器通过操作Cookie类对象对客户端Cookie进行操作。
Cookie类的主要方法
No.
方法
类型
描述
1
Cookie(String name, String value)
构造方法
实例化Cookie对象,传入cooke名称和cookie的值
2
public String getName()
普通方法
取得Cookie的名字
3
public String getValue()
普通方法
取得Cookie的值
4
public void setValue(String newValue)
普通方法
设置Cookie的值
5
public void setMaxAge(int expiry)
普通方法
设置Cookie的最大保存时间,即cookie的有效期,如果为正数,则该Cookie在>maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–16
public int getMaxAge()
普通方法
获取Cookies的有效期
7
public void setPath(String uri)
普通方法
设置cookie的有效路径,
8
public String getPath()
普通方法
获取cookie的有效路径
9
public void setDomain(String pattern)
普通方法
设置cookie的有效域
10
public String getDomain()
普通方法
获取cookie的有效域
1、Cookie操作
1)创建Cookie,并存储数据:通过构造器
2)把Cookie存放到响应中,响应给浏览器,即把共享的数据存储到浏览器中:通过response.addCookie(cookie);
3)获取Cookie以及Cookie中的数据:通过 request.getCookie() 获取客户端提交的所有Cookie(以Cookie[]数组形式返回)
4)修改Cookie中的属性值
方式一:创建一个属性名相同的Cookie,之前的值会被覆盖掉
方式二:获取该Cookie对象,通过setValue方法重新设置value值。
注意:不管哪种方式,修改之后都必须重新把该Cookie存放到响应中,通过response.addCookie(cookie);。
5)Cookie的分类
(1)会话Cookie(默认):关闭浏览器之后,Cookie就销毁了。
(2)持久化Cookie:可设置Cookie可以保存指定的时间段(一天,一周,一月等)。
通过setMaxAge(int seconds)方法设置Cookie的最大存活时间:
6)删除Cookie:通过 cookie对象.setMaxAge(0)方法
7)Cookie的中文问题:在Cookie中属性名和属性值都不能使用中文。
解决方案:使用URLEncodor解密和URLDecoder解密
2、简单demo
需求:登录页面,登录之后设置Cookie,然后跳转在获取Cookie值
登录页面:
登录页面
用户名:
密 码:
>
LoginServlet:
// 注意:必须以 / 打头
@WebServlet(value= {"/ck/login"})
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPut(req, resp);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
String username = req.getParameter("username") ;
// 创建Cookie,并存储数据,处理中文乱码
Cookie cookie = new Cookie("username",URLEncoder.encode(username, "UTF-8"));
// 设置Cookie的最大保存时间
cookie.setMaxAge(15);//单位秒
// 把Cookie响应给浏览器
resp.addCookie(cookie);
out.write("this is tilte");
out.write("欢迎:" + username +"");
out.write("获取Cookie");
out.write("");
}
}
CkGetServlet:
// 注意:必须以 / 打头
@WebServlet(value = { "/ck/get" })
public class CkGetServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPut(req, resp);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
String username = "";
//获取浏览器传递过来的Cookie数组
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("username".equals(name)) {
username = URLDecoder.decode(cookie.getValue(), "utf-8"); // 解码
}
}
}
out.write("this is tilte");
out.write("username Cookie值:" + username + "");
out.write("");
}
}
3、Cookie的缺陷
(1)不安全,多个人使用同一台电脑时,可以查看浏览器的Cookie信息
(2)Cookie存储中文比较麻烦,需要编码和解码
(3)Cookie的value是String类型,一个Cookie就只能存储一个数据,如果需要存储多个数据是,就得创建N个Cookie。
(4)一个站点对Cookie存储是有限制的
三、Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
Java中把Session封装成了 javax.servlet.http.HttpSession 接口。
Session 其本质就是一个会话Cookie(浏览器关闭之后,Session就失效了)
Session 主要方法:
1、public void setAttribute(String name,String value)
设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性是会话范围内存在,则更改该属性的值。
2、public Object getAttribute(String name)
在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。
3、public void removeAttribute(String name),
删除指定名字的session属性,若该属性不存在,则出现异常。
4、public void invalidate(),使session失效。
可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。
5、public String getId( ),
获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。
6、public void setMaxInactiveInterval(int interval)
设置会话的最大持续时间,单位是秒,负数表明会话永不失效。
7、public int getMaxInActiveInterval(),
获取会话的最大持续时间。
8、使用session对象的getCreationTime()和getLastAccessedTime()方法可以获取会话创建的时间和最后访问的时间,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。
1、Session操作
1)获取Session对象
2)在Session中存储数据,与获取数据
3)删除Session(用户注销登录)
(1)删除Session中指定属性名的值:removeAttribute(String name)
(2)销毁Session对象(Session中所有的数据都不存在):invalidate()
4)Session的超时管理
Tomcat中Session的默认超时时间为20分钟。
java通过 session.setMaxInactiveInterval(int seconds) 修改超时时间。
也可以修改web.xml 配置超时时间。例如修改为15分钟:
15
5)在Session中存储多个数据,就得调用多次方法
一般会把需要存储的数据封装成一个对象,然后再存储到Session中
6)如果多台服务器之间需要共享Session,此时Session中存储的对象,必须实现 java.io.Serializable接口
2、简单demo
public class User implements Serializable{
private String usernmae;
private String password;
...
}
LoginServlet:
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
String username = req.getParameter("username") ;
User user = new User();
user.setUsernmae(username);
// 获取Session对象
HttpSession session = req.getSession();
System.out.println(session.getId());
// 在Session中存储数据
session.setAttribute("user", user);
session.setMaxInactiveInterval(60 * 1);//单位秒
out.write("this is tilte");
out.write("欢迎:" + username +"");
out.write("获取Session");
out.write("");
}
CkGetServlet:
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
//获取Session对象
HttpSession session = req.getSession();
// 获取session中存储的数据
User user = (User) session.getAttribute("user");
String username = user.getUsernmae();
out.write("this is tilte");
out.write("username session值:" + username + "");
out.write("");
}
四、JavaScript操作Cookie
document.write(document.cookie);//获取cookie的键值对的字符串
JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的。
而cookie是运行在客户端的,所以可以用JS来设置cookie.
浏览器中的cookie信息,注意这里的cookie的expire/Max-Age过期时间,这个时间是格林尼治标准时间GMT,世界统一的时间,GMT+8小时就是北京时间。
1、设置cookie
//设置cookie
function setCookie(c_name, c_value, c_expiredays){ //c_expiredays: 天 ,key-value 存储数据
var expires = "";
if(c_expiredays != null){
var sysDate = new Date();
sysDate.setDate(sysDate.getDate() + c_expiredays);
expires = ";expires=" + sysDate.toUTCString();
}
document.cookie = c_name + "=" + escape(c_value) + expires;
}
setCookie("admin","admin123",1);
setCookie("aaa","v123",1);
alert(document.cookie);
2、获取cookie
//获取cookie方法1
function getCookie1(c_name){
if(document.cookie.length > 0){
//通过字符串截取
var start = document.cookie.indexOf(c_name + "=");
start = start + c_name.length + 1;
var end = document.cookie.indexOf(";", start);
if(end == -1){
end = document.cookie.length;
}
var c_value = document.cookie.substring(start,end);
return unescape(c_value);
}
}
//获取cookie方法2
function getCookie2(key){
var cookies = document.cookie.replace(/[ ]/g,""); //获取cookie,并且将获得的cookie格式化,去掉空格字符
var cookiesArr = cookies.split(";")
var c_value = '';
for(var i=0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?