一文把Servlet整的明明白白

简介: ​ Cookie(饼干) 是服务器通知客户端保存键值对的一种技术。客户端有了 Cookie 后,每次请求都发送给服务器。每个 Cookie 的大小不能超过 4kb。

1.JPG


一、Cookie


1.1、Cookie概述


Cookie(饼干) 是服务器通知客户端保存键值对的一种技术。客户端有了 Cookie 后,每次请求都发送给服务器。每个 Cookie 的大小不能超过 4kb。


1.2、创建Cookie


2.JPG


protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException,  IOException {
  //1 创建 Cookie 对象
    Cookie cookie = new Cookie("key","value");
    //2 相应给浏览器(客户端)
    Cookie cookie1 = new Cookie("key2","value2");
}   
复制代码


1.3、服务器获取Cookie


3.JPG

服务器获取客户端的 Cookie 只需要一行代码:req.getCookies();,他返回的是一个Cookie数组。


1.4、Cookie工具类


我们只做一个工具类,用于查找指定名称的 Cookie 对象。


public class CookieUtils {
/**
* 查找指定名称的 Cookie 对象
* @param name
* @param cookies
* @return
*/
  public static Cookie findCookie(String name , Cookie[] cookies){
    if (name == null || cookies == null || cookies.length == 0) {
      return null;
    }
    for (Cookie cookie : cookies) {
      if (name.equals(cookie.getName())) {//getName 方法返回 Cookie 的 key(名)
        return cookie;// getValue 方法返回 Cookie 的 value 值
                  }
    }
      return null;
  }
}
复制代码


1.5、Cookie值的修改


1.5.1、方案一


  1. 先创建一个要修改的同名(指的就是 key)的 Cookie 对象。
  2. 调用 response.addCookie( Cookie );


// Cookie cookie = new Cookie("key1","Value1");
Cookie cookie = new Cookie("key1","newValue1");
// 调用 response.addCookie( Cookie ); 通知 客户端 保存修改
resp.addCookie(cookie);
复制代码


1.5.2、方案二


  1. 先查找到需要修改的 Cookie 对象。
  2. 调用 setValue()方法赋于新的 Cookie 值。


1.6、浏览器查看Cookie


1.6.1、谷歌


网络异常,图片无法展示
|


1.6.2、火狐


网络异常,图片无法展示
|


1.7、Cookie的生命控制


我们可以管理Cookie 什么时候被销毁,这就是Cookie的生命控制。我们用setMaxAge()方法来控制。


参数值 意义
正数 表示在指定的秒数后过期
负数 表示浏览器一关闭,Cookie 就会被删除(默认值是-1)
表示马上删除Cookie


/**
* 设置存活 1 个小时的 Cooie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
  Cookie cookie = new Cookie("life3600", "life3600");
  cookie.setMaxAge(60 * 60); // 设置 Cookie 一小时之后被删除。无效
  resp.addCookie(cookie);
  resp.getWriter().write("已经创建了一个存活一小时的 Cookie");
}
/**
* 马上删除一个 Cookie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
    // 先找到你要删除的 Cookie 对象
Cookie cookie = CookieUtils.findCookie("key4", req.getCookies());
  if (cookie != null) {
    // 调用 setMaxAge(0);
    cookie.setMaxAge(0); // 表示马上删除,都不需要等待浏览器关闭
    // 调用 response.addCookie(cookie);
    resp.addCookie(cookie);
    resp.getWriter().write("key4 的 Cookie 已经被删除");
  }
}
/**
* 默认的会话级别的 Cookie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
  Cookie cookie = new Cookie("defalutLife","defaultLife");
  cookie.setMaxAge(-1);//设置存活时间,浏览器一关闭就销毁
  resp.addCookie(cookie);
}
复制代码


1.8、Cookie 有效路径的设置


Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器,哪些不发。path 属性是通过请求的地址来进行有效的过滤。


二、Session


2.1、Session概述


Session 就是会话,Session 本质上是一个借口(HttpSession)。它是用来维护一个客户端和服务器之间关联的一种技术。


每个客户端都有自己的一个 Session 会话,我们经常用来保存用户登录之后的信息。


2.2、Session 域数据的存取


/**
* 往 Session 中保存数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
  req.getSession().setAttribute("key1", "value1");
  resp.getWriter().write("已经往 Session 中保存了数据");
}
/**
* 获取 Session 域中的数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
  Object attribute = req.getSession().getAttribute("key1");
  resp.getWriter().write("从 Session 中获取出 key1 的数据是:" + attribute);
}
复制代码


2.3、Session 生命周期控制


public void setMaxInactiveInterval(int interval):设置 Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。值为正数的时候,设定 Session 的超时时长。负数表示永不超时(极少使用)。


public int getMaxInactiveInterval():获取 Session 的超时时间。Session 默认的超时时间长为 30 分钟。


public void invalidate() :让当前Session 会话马上超时无效。


6.JPG

protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
  // 先获取 Session 对象
  HttpSession session = req.getSession();
  // 设置当前 Session3 秒后超时
  session.setMaxInactiveInterval(3);
  resp.getWriter().write("当前 Session 已经设置为 3 秒后超时");
    // 让 Session 会话马上超时
  session.invalidate();
    resp.getWriter().write("Session 已经设置为超时(无效)");
}
复制代码

2.4、Session原理

Session 技术,底层其实是基于 Cookie 技术来实现的。

7.JPG

相关文章
|
3月前
|
前端开发 Java 应用服务中间件
一文讲明SpringMVC 【爆肝整理一万五千字】
文章提供了一份全面的SpringMVC教程,涵盖了SpringMVC的简介、创建实例、注解、获取请求参数的不同方式、域对象共享数据、视图渲染、RESTful风格、拦截器使用、异常处理以及文件上传下载等内容,并包含了相应的代码示例和测试结果。
一文讲明SpringMVC 【爆肝整理一万五千字】
|
5月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
44 3
|
5月前
|
测试技术
技术心得记录:复利计算器4.0之再遇JUnit
技术心得记录:复利计算器4.0之再遇JUnit
21 0
|
人工智能 前端开发 IDE
前端已死?后端已亡?弯弯绕绕,几分真几分假
前端已死?后端已亡?弯弯绕绕,几分真几分假
138 0
|
监控 前端开发 JavaScript
大厂前端日常窥探「贰」:前端大佬们都在干啥?
大厂前端日常窥探「贰」:前端大佬们都在干啥?
123 0
|
JSON 缓存 前端开发
Servlet:实现动态页面的技术,看我从头到尾带你穿过servlet基础的海洋,使君有所获,有所悟
Servlet:实现动态页面的技术,看我从头到尾带你穿过servlet基础的海洋,使君有所获,有所悟
|
存储 JSON 前端开发
Servlet 综合案例:表白墙
在学习过上文【Servlet API详解】的各位小主们,相信对Servlet的基本使用已经有了一定的掌握,这篇博文,博主带大家来手把手搭建一个小网站——表白墙,是对【JavaScript进阶3.2 表白墙案例】的一个升级版,也是对前边知识的一个综合运用,相信通过这一篇博文,能让各位小主get到一个网站的开发流程大概是什么样的,期待与你的共同进步!
121 0
Servlet 综合案例:表白墙
Java程序员怎样才能拿到年薪40万以上,从而告别重复的CRUD?
不想当将军的兵不是好兵,就程序猿不想当架构师就不是好的程序员! Java架构师主要需要做哪些工作呢? 1、负责设计和搭建软件系统架构(平台、数据库、接口和应用架构等),解决开发中各种系统架构问题。 2、优化现有系统的性能,解决软件系统平台关键技术问题攻关、核心功能模块设计、核心代码开发。 3、在项目需求不断细化的工程中校正整体的架构设计,以及详细模块拆分设计。 4、营造技术学习氛围,带领团队不断完善开发开发方法及流程,提升开发效率与质量,加强技术标准及规范。 5、带领团队攻克例如大数据量、高并发、高稳定性等带来的各种挑战及技术难关。 6、责任心强,有团队合作精神,工作认真负责高效
|
存储 Java 数据安全/隐私保护
《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(面向对象基础篇)
《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(面向对象基础篇)
《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(面向对象基础篇)
|
设计模式 XML 开发框架
《我要进大厂》- Spring框架 夺命连环22问,你能坚持到第几问?(Spring高频问题)(二)
《我要进大厂》- Spring框架 夺命连环22问,你能坚持到第几问?(Spring高频问题)
《我要进大厂》- Spring框架 夺命连环22问,你能坚持到第几问?(Spring高频问题)(二)