news 2026/10/15 3:33:27

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/10/14 21:03:25

技术架构的核心目标

技术架构的核心问题与目标 技术架构的核心在于解决系统在物理层面的稳定性、性能和扩展性问题&#xff0c;确保业务功能在复杂环境下可靠运行。以下是技术架构需重点解决的问题及实现目标&#xff1a;系统的物理组成 一个完整的系统由多个层级构成&#xff1a; 接入系统&#x…

作者头像 李华
网站建设 2026/10/15 10:24:05

算法导论第三版,学习日志,2.思考

2-1 &#xff08;在归并排序中对小数组采用插入排序&#xff09;虽然归并排序的最坏情况运行时间为 Θ(n lg n)&#xff0c;而插入排序的最坏情况运行时间为 Θ(n)&#xff0c;但是插入排序中的常量因子可能使得它在 n 较小时&#xff0c;在许多机器上实际运行得更快。因此&…

作者头像 李华
网站建设 2026/10/15 20:13:18

Python数据类型入门

引言 在Python编程中&#xff0c;数据类型就像“食材”&#xff0c;掌握它们才能做出美味的“代码大餐”。今天我们用生活中的例子&#xff0c;带大家认识Python最常用的6种数据类型&#xff0c;看完就能动手写代码&#xff01; 一、整数与浮点数&#xff1a;数字的两种形态 整…

作者头像 李华
网站建设 2026/10/15 12:47:32

基于遗传算法的多式联运车辆路径网络优优化研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真…

作者头像 李华
网站建设 2026/10/15 11:51:34

折叠与影像:高端手机技术演进的两大方向

每当为大家提供丰富选择的每年购物季时段来临之际&#xff0c;高端手机市场无一例外地都会出现新品发布会密集举行以及价格作出调整的情况。众多旗舰机型之中可以发现存在两个备受关注的技术方向&#xff0c;其中一个是折叠屏方向&#xff0c;另一个是影像旗舰方向&#xff0c;…

作者头像 李华