news 2026/1/31 3:02:29

JavaWeb-Request应用与Cookie[特殊字符]️Session

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaWeb-Request应用与Cookie[特殊字符]️Session

HtttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServlertRequest,通过这个HttpServlertRequest方法,获得客户端的所有信息;

获取前端传递的参数

请求转发

LoginServlet

publicclassLoginServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{}@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");Stringusername=req.getParameter("username");Stringpassword=req.getParameter("password");String[]hobbys=req.getParameterValues("hobbys");//后台中文乱码解决System.out.println("==============================");System.out.println(username);System.out.println(password);System.out.println(Arrays.toString(hobbys));System.out.println("==============================");resp.sendRedirect("/admin.jsp");// req.getRequestDispatcher("/admin.jsp").forward(req, resp);}}

web.xml

<servlet><servlet-name>login</servlet-name><servlet-class>com.cike.www.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>login</servlet-name><url-pattern>/login.do</url-pattern></servlet-mapping>

index.jsp

<%@ page contentType="text/html;charset=UTF-8"language="java"%><html><head><title>登录</title></head><body><h1>登录</h1><div><%--这里表单表示的意思:以post方式提交表单,提交到我们的login请求--%><form action="${pageContext.request.contextPath}/login.do"method="POST">用户名:<input type="text"name="username"><br>密码:<input type="password"name="password"><br>爱好:<input type="checkbox"name="hobbys"value="女孩"><input type="checkbox"name="hobby"value="代码"><input type="checkbox"name="hobby"value="唱歌"><input type="checkbox"name="hobby"value="电影"><br><input type="submit"></form></div></body></html>

admin.jsp

<%@ page contentType="text/html;charset=UTF-8"language="java"%><html><head><title>后台管理员管理平台</title></head><body><h1>登陆成功</h1></body></html>

面试题:请你聊一聊重定向和转发的区别?

  • 相同点:
    • 页面都会实现跳转
  • 不同点:
    • 请求转发的时候,url不会产生变化 200
    • 重定向的时候,url地址栏会发生变化 302 307

307 Temporary Redirect 可以理解为一个临时的重定向。

307 和302 重定向区别在于,307 约定客户端重定向之后不能改变原先的请求方法

会话

  • 会话:用户打开了一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
  • **有状态会话:**一个同学来过教师,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;

你能怎么证明你是cike_y 的学生?

你 cike_y

- 发票 cike_y给你发票 - 学校登记 cike_y标记你来过了

一个网站,怎么能证明你来过?

客户端 服务端

  1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie
  2. 服务器登记你来过了,下次你来的时候我来匹配你;session

保存会话的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息。我们可以把信息或者数据放在Session中!

常见场景:网站登录之后,你下次不用再登陆了,第二次访问直接登陆上了!(除非网站的机密性很高)

Cookie

  1. 从请求中拿到cookie信息
  2. 服务器响应给客户端cookie
Cookie[]cookies=req.getCookies();//获得cookiecookie.getName()// 获得cookie的keycookie.getValue()// 获取cookie的valueCookiecookie=newCookie("LastLoginTime",System.currentTimeMillis()+"");新建一个cookie cookie.setMaxAge(60*60*24);// 设置cookie有效期resp.addCookie(cookie);// 响应给客户端一个cookie

Cookie流程及实现

cookie:一般会保存在本地的用户目录下的appdata;

一个网站cookie是否存在上限!聊聊细节问题

  • 一个Cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,每个站点最多存放20个
  • 300个cookie浏览器上限
  • Cookie大小有限制4kb (4096字节)
//保存用户上一次访问的时间publicclassCookieDemo1extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//服务器,告诉你,你来的时间,把这个时间封装成一个信件,你下带来,我就知道你来了//解决中文乱码req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=UTF-8");PrintWriterout=resp.getWriter();//Cookie,服务端从客户端获取呀;Cookie[]cookies=req.getCookies();//这里返回数组,说明Cookie可能存在多个//判断Cookie是否存在if(cookies!=null){// 如果存在怎么办out.write("你上一次访问的时间是:");for(inti=0;i<cookies.length;i++){Cookiecookie=cookies[i];//获取cookie的keyif(cookie.getName().equals("LastLoginTime")){//获取Cookie中的valuelongl=Long.parseLong(cookie.getValue());Datedate=newDate(l);out.write(date.toLocaleString());}}}else{out.write("Cookie not found,这是您第一次访问本站,还没有获得信件呢");}// 服务器给客户端响应一个CookieCookiecookie=newCookie("LastLoginTime",System.currentTimeMillis()+"");//系统当前的时间戳cookie.setMaxAge(60*60*24);resp.addCookie(cookie);}}

web.xml

<servlet><servlet-name>cookie</servlet-name><servlet-class>com.cike.CookieDemo1</servlet-class></servlet><servlet-mapping><servlet-name>cookie</servlet-name><url-pattern>/cookie</url-pattern></servlet-mapping>

可以利用在线工具进行测试cooke的精准度如何?

https://tool.lu/timestamp/

可以发现当我们使用上一次的cookie值进行在线转化,发现确实是这个时间点

删除Cookie

删除Cookie:

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效期时间为0,
publicclassCookieDemo02extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Cookiecookie=newCookie("LastLoginTime",System.currentTimeMillis()+"");cookie.setMaxAge(0);resp.addCookie(cookie);Cookiecookie1=newCookie("name","李梦茹");cookie1.setMaxAge(0);resp.addCookie(cookie1);}}

web.xml

<servlet><servlet-name>delete</servlet-name><servlet-class>com.cike.CookieDemo02</servlet-class></servlet><servlet-mapping><servlet-name>delete</servlet-name><url-pattern>/delete</url-pattern></servlet-mapping>

可以看见Cookie被删除了

中文Coookie传递

主要是这个关键代码:

resp.setContentType("text/html;charset=GB18030");
publicclassCookieDemo03extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//解决中文乱码,代码顺序应该重上往下req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");// 解决Cookie的编码在网页为中文resp.setContentType("text/html;charset=GB18030");Cookie[]cookies=req.getCookies();PrintWriterout=resp.getWriter();if(cookies!=null){out.write("你的名字是:");for(inti=0;i<cookies.length;i++){Cookiecookie=cookies[i];if(cookie.getName().equals("name")){out.write(cookie.getValue());}}}else{out.write("Cookie not found,这是您第一次访问本站,还没有获得信件呢");}Cookiecookie=newCookie("name","李梦茹");resp.addCookie(cookie);}}

web.xml

<servlet><servlet-name>03</servlet-name><servlet-class>com.cike.CookieDemo03</servlet-class></servlet><servlet-mapping><servlet-name>03</servlet-name><url-pattern>/03</url-pattern></servlet-mapping>

Session(重点)

多个

原理

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象;
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;一个浏览器开多少个窗口Session都是一样的
  • 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……

Coookie和Session的区别

Session和Cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以多个保存)
  • Session把用户的数据写道用户独占Session中,服务端保存(保存重要信息,减少服务器资源的浪费)
  • Session对象由服务创建;

使用场景:

  • 保存一个登录用的信息;
  • 购物车信息;
  • 在整个网站中经常会使用的数据,我们将它保存到Session中;

使用Session

存东西的来源对象

packagecom.pojo;publicclassPerson{privateStringname;privateintage;publicPerson(){}publicPerson(Stringname,intage){this.name=name;this.age=age;}publicPerson(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}@OverridepublicStringtoString(){return"Person{"+"name='"+name+'\''+", age="+age+'}';}}

SessionDemo01

publicclassSessionDemo01extendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{// 解决乱码问题response.setCharacterEncoding("UTF-8");request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");PrintWriterout=response.getWriter();// 得到sessionHttpSessionsession=request.getSession();// 给Session中存东西session.setAttribute("name",newPerson("胡锦洋",19));// 获取Session的IDStringid=session.getId();// 判断Session是不是新的if(session.isNew()){out.write("session 创建成功!ID为:"+id);}else{out.write("已经存在了Session:ID为:"+id);}// Session创建的时候做了什么事情;// Cookie cookie = new Cookie("JSESSIONID", id);// response.addCookie(cookie);}}

获取Session

publicclassSessionDemo02extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 解决乱码问题req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriterout=resp.getWriter();// 获取SessionHttpSessionsession=req.getSession();Personperson=(Person)session.getAttribute("name");out.println(person);System.out.printf(person.toString());}}

web.xml

<servlet><servlet-name>session</servlet-name><servlet-class>com.cike.SessionDemo01</servlet-class></servlet><servlet-mapping><servlet-name>session</servlet-name><url-pattern>/session</url-pattern></servlet-mapping><servlet><servlet-name>session2</servlet-name><servlet-class>com.cike.SessionDemo02</servlet-class></servlet><servlet-mapping><servlet-name>session2</servlet-name><url-pattern>/session2</url-pattern></servlet-mapping>

session创建成功

获取Session

注销Session

用户不仅仅可以手动注销,也可以自动注销

Session手动注销

SessionDelete

publicclassSessionDeleteextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{HttpSessionsession=req.getSession();session.removeAttribute("name");// 手动注销sessionsession.invalidate();}@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{doGet(req,resp);}}
<servlet><servlet-name>deletesession</servlet-name><servlet-class>com.cike.SessionDelete</servlet-class></servlet><servlet-mapping><servlet-name>deletesession</servlet-name><url-pattern>/delte</url-pattern></servlet-mapping>

Session自动过期

web.xml配置

<!-- 设置Session默认的失效时间--><!-- session的配置--><session-config><!-- 1分钟后Session自动失效,以分钟为单位--><session-timeout>1</session-timeout></session-config>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/29 14:25:01

数据结构:二叉排序树,平衡二叉树,红黑树的介绍

一.二叉排序树二叉排序树的定义是任意一个父节点的值&#xff0c;大于其左子树节点的值&#xff0c;小于其右子树节点的值。以下是两个例子&#xff1a;&#xff08;1&#xff09;数组&#xff1a;5,3,1,4,8,9,7它的二叉排序树是这样的&#xff1a;它的时间复杂度是O(logn)。&a…

作者头像 李华
网站建设 2026/1/30 6:51:08

软件复用的分类与实现

复用的分类 复用的形式可以分为技术复用和业务复用两大类。技术复用包括代码复用和技术组件复用&#xff1b;业务复用包括业务实体复用、业务流程复用和产品复用。从复用的程度来看&#xff0c;从高到低依次划分为产品复用、业务流程复用、业务实体复用、组件复用、代码复用。 …

作者头像 李华
网站建设 2026/1/22 15:02:29

google服务

“谷歌服务框架”、“谷歌Play服务”和“谷歌商店App”通常被并称为“谷歌三件套”。 它们是谷歌为Android系统提供的核心软件组件&#xff0c;构成了谷歌移动服务&#xff08;GMS&#xff09;的基础。对于绝大多数安卓用户&#xff0c;特别是使用国产手机的用户&#xff0…

作者头像 李华
网站建设 2026/1/28 14:10:13

进程PCB

1. PCB 到底是什么&#xff1f;从代码角度看&#xff0c;PCB 就是内核空间里定义的一个巨大的 C 语言结构体 (Struct)。存放位置&#xff1a;它存在于内核内存区 (Kernel Space)&#xff0c;普通用户程序无法直接读写&#xff0c;只有操作系统核心才能访问。生命周期&#xff1…

作者头像 李华
网站建设 2026/1/24 8:25:19

实战教程:1小时掌握逆向Unity游戏 (共13课时)

逆向不求人&#xff1a;1小时极速打通Unity游戏逆向任督二脉 引言&#xff1a;为什么每个开发者都应该懂点逆向&#xff1f; 在游戏开发的世界里&#xff0c;逆向工程常常被视为一种“神秘技能”。但真相是&#xff1a;理解逆向就是理解软件的终极运行逻辑。对于Unity开发者而…

作者头像 李华
网站建设 2026/1/28 6:29:54

[从零构建操作系统]08 函数调用时栈的底层行为解析

第一步&#xff1a;在 kernel_init 里安家&#xff08;黄色区域&#xff09;代码位置&#xff1a; 右上角 kernel_init 函数开头栈图对应&#xff1a; 左侧黄色的 “局部变量和数据”sub $0x10, %esp动作&#xff1a; 也就是把栈顶指针 esp 往下拉 16 个字节&#xff0c;给 ker…

作者头像 李华