当前位置: 首页 > news >正文

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>
http://www.cnnetsun.cn/news/42606.html

相关文章:

  • 数据结构:二叉排序树,平衡二叉树,红黑树的介绍
  • 软件复用的分类与实现
  • google服务
  • 进程PCB
  • 实战教程:1小时掌握逆向Unity游戏 (共13课时)
  • [从零构建操作系统]08 函数调用时栈的底层行为解析
  • 力扣hot100:搜索插入位置
  • Java冷启动全指南:从原理到实战优化
  • 测试 - 单元测试(JUnit)
  • C++中多态
  • c++经典练习题-多分支
  • qt为什么转向用cmake放弃qmake
  • 云屋音视频 SDK 凭何成为信创技术困局的 “破局者”?
  • 纯电动汽车动力经济性仿真:Cruise与Simulink联合仿真(2015版),包含BMS、再...
  • 【怎么理解maven中的镜像和仓库?】
  • comsol枝晶生长,沉积模型,包括:典型,形状成核,随机成核,均匀沉积,雪花晶形成过程。 适...
  • 终极指南:Qwen3-30B-A3B多GPU分布式推理完整解决方案
  • 腾讯混元语音驱动数字人技术:重塑动态视频生成新范式
  • 【MicroPython编程-ESP32篇】-Web页面显示DHT11传感器数据
  • DCDC电池模型:基于Matlab 2018b及以上的应用
  • Day 38 - Dataset 和 DataLoader
  • [C#][winform]基于yolov11的打架行为检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
  • 2022年TRC SCI1区TOP,基于随机分形搜索算法的多无人机四维航迹优化自适应冲突消解方法,深度解析+性能实测
  • 《智能世界2035》——华为预测十年以后智能世界的模样
  • FLAC3D随机裂隙建模:从基础到复杂网络
  • 终极指南:TUnit服务虚拟化测试实践
  • 速读顶会论文:GoodSpeed - 让分布式LLM推理既快又公平的自适应推测解码框架
  • 基于MATLAB的零件表面缺陷检测系统设计与实现
  • c++类和对象(上)
  • Windows11中使用VS2022编译运行libevent网络库