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的值

方案一:

  1. 先创建一个要修改的同名的Cookie对象
  2. 在构造器,同时赋于新的Cookie值
  3. 调用response.addCookie( Cookie )

方案二:

  1. 先查找到需要修改的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是不会占用服务器的资源的

最新文章

  1. shell脚本连接、读写、操作mysql数据库实例
  2. Luogu题目集合[6/未完待续]
  3. linux 磁盘管理以及维护
  4. 剑指offer系列26--正则表达式匹配
  5. Knockout : 实现复杂的web聊天窗体
  6. java中字符串切割的方法总结
  7. jQuery 鼠标拖拽排序
  8. 使用jQuery和css3实现了仿淘宝ued博客左边的菜单切换动画
  9. CodeForces 618C CodeForces 618C
  10. 备忘录模式(Memento)
  11. tomcat无法打开8080页面
  12. Java数组排序基础算法,二维数组,排序时间计算,随机数产生
  13. Java 容器源码分析之 ArrayList
  14. Linux下su 与 su - 区别
  15. 查询系统正在运行的SQL语句
  16. pytorch统计模型参数量
  17. C# 集合、字典、栈和队列
  18. 3.div+css 的布局较 table 布局有什么优点
  19. 红帽7配置samba文件共享服务
  20. js中改变文档的层次结构(创建元素节点,添加结点,插入子节点,取代子节点,删除子节点)

热门文章

  1. 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功
  2. Linux命令查看内存、整体负载、端口查看、进程查看、vim编辑器(3)
  3. javascript-jquery-文档处理
  4. 4.19——数组双指针——26. 删除有序数组中的重复项 &amp; 27. 删除有序数组中的重复项II &amp; 80. 删除有序数组中的重复项 II
  5. python使用Django框架开发简单项目
  6. 微信小程序的登录流程
  7. GPIO原理与配置(跑马灯,蜂鸣器,按键)
  8. 洛谷 P2221 [HAOI2012]高速公路
  9. advanced base-scripting guide in chinese(高级Bash脚本编程指南-10)
  10. Jquery校验中国身份证号码是否正确