JavaWeb详细讲述Cookie和Session的概念
作者:Dragon_qing 发布时间:2022-03-23 08:39:44
1.会话
会话: 用户打开了一个浏览器,点击了很多超链接,访问多个web次元,关闭浏览器,这个过程可以称之为会话
有状态会话: 带有访问记录的会话
1.服务端会给客户端一个cookie,客户端下次访问时携带cookie访问就可以了 cookie
2.服务端登记客户端访问过,下次访问时匹配到客户端; session
2.保存会话的两种技术
cookie
客户端技术(响应,请求)
session
服务器技术,利用这个技术,可以保存用户的会话信息,可以把信息或者数据保存在Session中。
常见场景:网站登录之后,下次不用再登录了,第二次访问直接就上去了!
3.Cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
cookie相关方法:
Cookie[] cookies = req.getCookies(); //获得cookie
cookie.getName() //获得cookie中的键
cookie.getValue() //获得cookie中的值
new Cookie("LastLoginTime",System.currentTimeMillis()+"") //新建一个cookie
cookie.setMaxAge(24*60*60); //设置cookie有效期
resp.addCookie(cookie); //响应给客户端一个cookie
案例:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();
//判断cookie是否存在
if(cookies == null){
out.println("第一次访问网站");
}else{
out.write("您上一次访问的时间是:");
for (Cookie cookie : cookies) {
if("LastLoginTime".equals(cookie.getName())){
//获取cookie中的值
long time = Long.parseLong(cookie.getValue());
Date date = new Date(time);
DateFormat dfd = DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA);
DateFormat dft = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.CHINA);
out.write(dfd.format(date)+dft.format(date));
}
}
}
Cookie cookie = new Cookie("LastLoginTime",System.currentTimeMillis()+"");
//设置cookie有效期为一天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
cookie:一般会保存在本地的用户目录下appdate;
一个网站cookie是否存在上限?
一个cookie只能保存一个信息;
一个web网站可以给浏览器发送多个cookie,最多存放20个cookie;
cookie大小有限制4kb
300个cookie浏览器上限
删除cookie:
不设置有效期,关闭浏览器,自动失效;
设置有效期时间为0;
注意:在cookie的值为中文时最好使用URLEncoder.encode()来进行编码,防止中文乱码。取值时用URLDecoder.decode()来解码。
4.Session
什么事session:
服务器会给每一个用户创建一个session对象
一个session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
用户登录之后,整个网站都可以访问 -->保存用户的信息;
Session常用的方法
Session和cookie的区别:
Cookie是把用户的数据写到用户的浏览器,浏览器保存(可以保存多个)
session把用户的数据写到用户独占的Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
session对象由服务器创建;
使用场景:
保存一个登录用户的信息;
购物车信息;
在整个网站中经常会使用的数据,我们将它保存到Session中;
使用session:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
//得到Session
HttpSession session = req.getSession();
//给session中存东西
session.setAttribute("name",new Person("张三",18));
//获取session的id
String id = session.getId();
//判断session是不是新创建的
if(session.isNew()){
out.write("session创建成功,ID:"+id);
}else{
out.write("session已经存在,id:"+id);
}
//Session创建的时候做了什么事
// Cookie jsessionid = new Cookie("JSESSIONID", id);
// resp.addCookie(jsessionid);
}
//Person类
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
获取session中的信息
//得到Session
HttpSession session = req.getSession();
Person name = (Person) session.getAttribute("name");
System.out.println(name);
注销session
//得到Session
HttpSession session = req.getSession();
session.removeAttribute("name");
//注销session
session.invalidate();
会话自动过期:web.xml配置
<!-- 设置Session的默认失效时间-->
<session-config>
<!-- 15分钟后session自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>
来源:https://blog.csdn.net/Dragon_qing/article/details/125506458


猜你喜欢
- 目录1 CyclicBarrier方法说明2 CyclicBarrier实例3 CyclicBarrier源码解析CyclicBarrier
- —学习并使用mybatis-plus的一些高级功能的用法例如: AR模式、 乐观锁 、逻辑删除 、自动填充、数据保护等功能为了方便演示,咱们
- 我就废话不多说了,大家还是直接看代码吧~ string url = "https://cloud.soei.com.cn/smsa
- 本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下话不多说先上效果前言写这个音乐播放器实在是迫不得已。因为我们
- HashMap的get()方法的NullPointerException今天写代码发现一个 bug,HashMap的 get() 方法一直报
- 本文实例为大家分享了Android实现点击获取验证码60秒后重新获取的具体代码,供大家参考,具体内容如下上代码/** * Created b
- MyBatis 通过包含的jdbcType类型BIT FLOAT CHAR &nbs
- 为什么要学习Android与H5互调?微信,QQ空间等大量软件都内嵌了H5,不得不说是一种趋势。Android与H5互调可以让我们的实现混合
- 一、Error:All flavors must now belong to a named flavor dimension问题描述:Er
- 匿名类类型类可以是匿名的 - 也就是说,可以在没有 identifier 的情况下声明类。在将类名称替换为 typedef 名称时,这会很有
- Spring概述Spring就是为解决企业应用开发的复杂性而创建的,做为开源中间件,它使用基本的JavaBean来完成以前只可能有EJB(J
- HtmlAgilityPack 是一个开源的快速解析Html的C#类库。简单理解,它可以像解析Xml一样,将Html根据XPATH转化为一个
- 最近做项目,ORM 使用的是 MyBatis,为了偷懒,我自然而然的想到了使用 MyBatis Generator(MBG)来生成数据库表对
- 前言本文讲解了在Spring 应用中创建Bean的多种方式,包括自动创建,以及手动创建注入方式,实际开发中可以根据业务场景选择合适的方案。方
- 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”。异常通常由错误的代码引发,并由能够更正错误的代码进行
- mybatis-plus想要修改某字段为null问题场景使用mybatis + mybatisPlus进行修改某字段,想要将其设为null,
- 什么是Run Dashboard当springcloud的服务有多个时,管理多个服务的启动使用run会不好管理,这样我们就可以使用Run D
- Objects工具类jdk 1.7引进的工具类,都是静态调用的方法,jdk 1.8新增了部分方法重点方法equals用于字符串和包装对象的比
- 这篇做了一个简单的时间轴控件。右侧的数据就是一个简单的字符串。问题还是有的,当右侧的文字长度不一样的时候就会有问题了。现在可以修改一下适配右
- RestAPI中, 经常需要操作json字符串, 需要把json字符串"反序列化"成一个对象, 也需要把一个