JavaWeb Cookie,Session
Cookie
1.Cookie翻译过来是饼干的意思。Cookie是服务器通知客户端保存键值对的一种技术。客户端有了Cookie 后,每次请求都发送给服务器。每个Cookie的大小不能超过4kb.
2.如何创建cookie,在客户端保存数据
cookie这个对象servlet的jar包给我们提供的,我们只需要去创建cookie,并且通知浏览器保存cookie就可以了!
/**
* 创建cookie对象并且通知浏览器保存多个cookie
*
* @param req
* @param resp
*/
public void addCookie(HttpServletRequest req, HttpServletResponse resp)
{
//创建cookie对象
Cookie cookie1 = new Cookie("username","Tom");
//通知浏览器保存cookie
resp.addCookie(cookie1);
Cookie cookie2 = new Cookie("password","123456");
//通知浏览器保存cookie
resp.addCookie(cookie2);
Cookie cookie3 = new Cookie("address","beijing");
//通知浏览器保存cookie
resp.addCookie(cookie3);
Cookie cookie4 = new Cookie("idCard","987654");
//通知浏览器保存cookie
resp.addCookie(cookie4);
}
3.cookie的生命周期
cookie默认的生命周期是一个session级别的,浏览器的开启到关闭
4.获取客户端的cookie
/**
* 获取客户端所有的cookie
* 获取cookie没有提供获取单个cookie的方法,只有获取所有cookie,再筛选
* @param req
* @param resp
*/
public void getCookies(HttpServletRequest req, HttpServletResponse resp)
{
//根据请求对象获取客户端的cookie
Cookie[] cookies = req.getCookies();
//遍历cookie数组
//cookie.getName() 获取cookie的name
//cookie.getValue()获取cookie的value
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+" "+cookie.getValue());
try {
resp.getWriter().print(cookie.getName()+" "+cookie.getValue());
resp.getWriter().print("<br>");
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.修改cookie的值
方案一:
- 先创建一个要修改的同名的Cookie对象
- 在构造器,同时赋于新的Cookie值
- 调用response.addCookie( Cookie )
方案二:
- 先查找到需要修改的Cookie对象
2、调用setValue()方法赋于新的Cookie值。
3、调用response.addCookie()通知客户端保存修改
/**
* 修改cookie的值
* @param req
* @param resp
*/
public void setCookie(HttpServletRequest req, HttpServletResponse resp)
{
//方法一:cookie 的 key不能重复,所以可以通过覆盖的方式
//把username的值改为jack
Cookie cookie = new Cookie("username", "jack");
resp.addCookie(cookie);
//方法2:
Cookie c=null;
Cookie[] cookies = req.getCookies();
for (Cookie cookie1 : cookies) {
if (cookie1.getName().equals("password"))
{
cookie1.setValue("456789");
c=cookie1;
}
}
resp.addCookie(c);
}
6.cookie在开发中的作用
- cookie可以将数据保存在客户端,域对象request、servletContext是将数据保存在服务端。
- cookie保存数据的大小不能超过4kb
- 在开发登录模块的时候,通常会将用户名和密码的数据保存中cookie中(免密码登录、记住密码)
- 开发购物车模块,我们会将购物车的商品信息保存在cookie中,用户将商品添加到购物车,没有必要将商品数据添加到数据库中,因为并不知道会不会付款,我们可以设置生命周期为一周,那么如果用户一周内不付款,则商品购物车的信息就将清空
EL表达式取出cookie中的数据:
取出cookie中的数据要注意其生命周期
<%--el表达式获取cookie中的数据--%>
${cookie.username.value}
${cookie.password.value}
栗子:
Cookie cookie = new Cookie("username","test");
resp.addCookie(cookie);
创建一个cookie,名称是username,值是test的cookie对象,然后发送给服务端。
然后在前台页面通过EL表达式获取cookie的值。
${cookie.username.name} 得到"username"。
${cookie.username.value}得到"test"。
Session
1、Session就一个接口(HttpSession)。
2、Session就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都有自己的一个Session会话。
4、Session会话中,我们经常用来保存用户登录之后的信息
session是在服务端保存数据的一种技术,而且session可以关联客户端和服务端,session和cookie是有一定联系的。session也可以说是一个域对象,可以存取值,取值范围是浏览器的开启到关闭。以后会用session来保存用户登录之后的用户信息,之前所完成的登录功能是不完整的,在前端校验会话中是否有用户数据,如果有的话,才能是登录成功!session是一个单例对象。
创建session会话
request.getSession() 第一次调用是:创建Session会话
. isNew(); 判断到底是不是刚创建出来的。
getld(); 得到 Session的会话id值
创建session对象需要用到request对象,HttpSession session=request.getSession();
session生命周期控制
public void setMaxInactivelnterval(int interval):
设置Session的超时时间,超过指定的时长,Session就会被销毁,值为正数的时候,设定Session的超时时长。负数表示永不超时
getMaxInactivelnterval(): 获取Session的超时时间
invalidate():让当前Session会话马上超时无效。
session默认超时时间是30分钟,可以用session.setMaxInactiveInterval();方法设置。同时还可以在web.xml中配置超时时间,但此时单位是分钟
<!--设置默认的超市时间-->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
让当前session直接失效的方法 session.invalidate(),而cookie可以设置超时时间为0来使其失效。这个主要可以运用到账户的注销。
public class SessionDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
HttpSession session2 = req.getSession();
//往session域中存数据
session.setAttribute("key1","value1");
session.setAttribute("key2","value2");
//设置超时时间
//session.setMaxInactiveInterval(60*60*24);
//让当前session直接失效的方法 cookie可以设置超时时间为0来使其失效
//session.invalidate();
resp.getWriter().print("Session是否是新创建出来的 "+session.isNew()+"<br>");
resp.getWriter().print("Session的会话id值为 "+session.getId()+"<br>");
resp.getWriter().print("Session对象是否是单例的 "+(session==session2)+"<br>");
resp.getWriter().print("取出session域中的数据key1 "+(session.getAttribute("key1"))+"<br>");
resp.getWriter().print("取出session域中的数据key1 "+(session.getAttribute("key1"))+"<br>");
//不设置超时时间的情况下直接去获取超时时间就是默认的超时时间
resp.getWriter().print("session默认超时时间为(s): "+(session.getMaxInactiveInterval())+"<br>");
}
}
Session和Cookie的联系与区别
关系:
cookie保存数据的原理就是通过http协议响应头的方式把数据传递过去
在浏览器访问服务端的时候,假设我们并没有手动的去创建session对象,但是我们在响应头中发现:会有一个set-cookie:
JSESSIONID = 4A810828D9F1821CFFD231E9267BFF3B
JSESSIONID =session的会话id
所以要想获得会话id,就必须得有session对象。
因此,浏览器访问服务端的时候,如果我们创建了session对象,会自动生成会话id,然后在底层会自动通过创建cookie对象的方式将会话id保存下来。我们在cookie中会找到JSESSIONID 4A810828D9F1821CFFD231E9267BFF3B 的记录
区别:
- cookie是客户端保存数据的技术:cookie只能存放一些基本的数据,json串,不能存放java对象。cookie相对来说是不安全的,因为数据存在浏览器的内存里,可以通过一些途径来获取到这些数据。
- session是服务端保存数据的技术:可以存放的数据类型有很多,String、List、Map、Java对象。session相对来说是安全的,但是会占用服务器的资源,cookie是不会占用服务器的资源的
最新文章
- shell脚本连接、读写、操作mysql数据库实例
- Luogu题目集合[6/未完待续]
- linux 磁盘管理以及维护
- 剑指offer系列26--正则表达式匹配
- Knockout : 实现复杂的web聊天窗体
- java中字符串切割的方法总结
- jQuery 鼠标拖拽排序
- 使用jQuery和css3实现了仿淘宝ued博客左边的菜单切换动画
- CodeForces 618C CodeForces 618C
- 备忘录模式(Memento)
- tomcat无法打开8080页面
- Java数组排序基础算法,二维数组,排序时间计算,随机数产生
- Java 容器源码分析之 ArrayList
- Linux下su 与 su - 区别
- 查询系统正在运行的SQL语句
- pytorch统计模型参数量
- C# 集合、字典、栈和队列
- 3.div+css 的布局较 table 布局有什么优点
- 红帽7配置samba文件共享服务
- js中改变文档的层次结构(创建元素节点,添加结点,插入子节点,取代子节点,删除子节点)
热门文章
- 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功
- Linux命令查看内存、整体负载、端口查看、进程查看、vim编辑器(3)
- javascript-jquery-文档处理
- 4.19——数组双指针——26. 删除有序数组中的重复项 &; 27. 删除有序数组中的重复项II &; 80. 删除有序数组中的重复项 II
- python使用Django框架开发简单项目
- 微信小程序的登录流程
- GPIO原理与配置(跑马灯,蜂鸣器,按键)
- 洛谷 P2221 [HAOI2012]高速公路
- advanced base-scripting guide in chinese(高级Bash脚本编程指南-10)
- Jquery校验中国身份证号码是否正确