javaWeb之cookiesession

news2024/11/9 2:17:29

1 回顾

1.1 response对象

一次响应封装对象,由服务器创建。使用response对象将服务器需要的数据发送给浏览器。
将数据存放response对象中,tomcat从response对象获得数据,根据数据组织http响应,最后将http响应内容发送给浏览器,浏览器获得所有响应内容进行解析。最后将响应体的内容显示给用户。
响应行:response.setStatus(302)
响应头:response.setHeader(name,value)
		response.setIntHeader()
		response.setDateHeader()
响应体:发送流数据
字符流:PrintWriter response.getWriter()  建议发送中文数据。
字节流:ServletOutputStream response.getOutputStream()  发送字节数据(下载)
中文乱码处理:
	api:response.setContentType("text/html;charset=UTF-8"):
	手动:
		response.setHeader("content-type","text/html;charset=UTF-8");
	html建议:
		out.print("<meta http-equiv="content-type" content="text/html;charset=UTF-8">");
输出缓存:8kb,isCommitted是否提交等

1.2 request对象

一次请求封装对象。
获得浏览器发送请求参数、给request属性(作用域)设置内容提供给服务器使用,其他api使用
请求参数
request.getParameter(name) 获得一个值
request.getParameterValues(name) 获得一组值
request.getParameterMap() 获得所有值
属性操作 xxxAttribute
先setAttribute设置值
使用请求转发 到另一个页面B 
B页面中使用 getAttribute获得内容。
请求参数乱码
post请求:request.setCharacterEncoding("UTF-8");
get请求:new String(xxx.getBytes("ISO-8859-1") , "UTF-8")

1.3 请求转发和重定向

浏览器发送请求,可能涉及多个页面。
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a737f74fb65e4334b2cea91f22c49999.png)

请求次数
转发:1次
重定向:2次
浏览器地址栏是否改变
转发:不改变
重定向:改变
request作用域数据是否共享
转发:共享(两个request对象,但数据共享的(克隆))
重定向:不共享(创建两个新的request对象,且没有关系的)
api使用
转发:request.getRequestDispatcher("....").forward(request,response);  -- 让当次请求继续延续下去。
重定向:请求通过浏览器改变方法。response.sendRedirect("location")
使用范围
转发:只能在当前web项目中转发,不能转发到另一个web项目中,/表示web项目根。
	例如:D:\java\tomcat\apache-tomcat-7.0.53\webapps\day08
		request.getRequestDispatcher("/a/b/oneServlet").forward()
				http://localhost:8080/day08/a/b/oneServlet
重定向:改变方向任意。如果重定向到当前tomcat下,/表示web站点
	例如:D:\java\tomcat\apache-tomcat-7.0.53\webapps\
		response.sendRedirect("/day08/a/b/oneServlet");
				http://localhost:8080/day08/a/b/oneServlet

2 会话技术

会话可简单理解为:用户开一个浏览器,点击多个超链接(多次请求),访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
会话技术:
cookie:浏览器端会话技术
session:服务器端会话技术
目的:在一次会话中(多次请求)共享数据。

在这里插入图片描述

3 cookie技术

  •   cookie技术不局限java,其他语言也支持。例如:php、javascript等
    
  •   JavaEE 规范提供工具类对Cookie进行操作。javax.servlet.http.Cookie类
    
  •   cookie 是什么
    
      1. servlet创建cookie,保存少量数据,发送浏览器。
      1. 浏览器获得服务器发送的cookie数据,将自动的保存到浏览器端。
      1. 下次访问时,浏览器将自动携带cookie数据发送给服务器。
  • cookie操作
    1.创建cookie:new Cookie(name,value)
    2.发送cookie到浏览器:HttpServletResponse.addCookie(Cookie)
    3.servlet接收cookie:HttpServletRequest.getCookies() 浏览器发送的所有cookie

  • cookie特点
    每一个cookie文件大小:4kb , 如果超过4kb浏览器不识别
    一个web站点(web项目):发送20个
    一个浏览器保存总大小:300个
    cookie 不安全,可能泄露用户信息。浏览器支持禁用cookie操作。
    默认情况生命周期:与浏览器会话一样,当浏览器关闭时cookie销毁的。—临时cookie

    cookie api
    getName() 获得名称
    getValue() 获得值

    setValue(java.lang.String newValue) 设置内容
    setMaxAge(int expiry) 设置有效时间【】
    setPath(java.lang.String uri) 设置路径【】
    setDomain(java.lang.String pattern) 设置域名 , 一般无效,有浏览器自动设置,setDomain(“.itheima.com”)
    www.itheima.com / bbs.itheima.com 都可以访问
    a.b.itheima.com无法访问
    isHttpOnly() 是否只是http协议使用。只能servlet的通过getCookies()获得,javascript不能获得。

    setComment(java.lang.String purpose) (了解)
    setSecure(boolean flag) (了解)
    setVersion(int v) (了解)

3.1 路径

cookie默认路径:当前访问的servlet 父路径
例如:http://localhost:8080/day09/a/b/c/SendCookieServlet
默认路径: /day09/a/b/c/
通过 setPath 修改cookie访问路径,一般使用:setPath("/")  --web站点的根(没有项目名)
	设置路径与servlet访问无关。servlet 去获得cookie有关。
如果编写一个servlet 获得cookie  GetCookiesServlet --> getCookies()
http://localhost:8080/day09/a/b/c/SendCookieServlet1  --》/day09/a/b/c/
http://localhost:8080/day09/a/b/SendCookieServlet2   --》/day09/a/b/
http://localhost:8080/day09/a/SendCookieServlet3	--》/day09/a/
http://localhost:8080/day09/d/SendCookieServlet4	--》/day09/d

如果此获得cookie 访问路径
	http://localhost:8080/day09/a/b/c/ ,使用项目之后内容"/day09/a/b/c/".startWith(....)
			访问的servlet路径,必须与cookie本地设置路径 判断。
	通过getCookies()获得 cookie1/cookie2/cookie3
通常使用setPath("/") 其他servlet "/day09".startWith("/") 肯定都是/开头。所以可以访问
	通途:保证在tomcat下所有的web项目可以共享相同的cookie	
	例如:tieba , wenku , beike 多个项目共享数据。例如用户名。
当前项目访问:setPath("/day09/")

3.2 有效时间

默认情况:cookie临时,当浏览器关闭销毁的。
setMaxAge 可以修改cookie被浏览器保存的时间。浏览器将cookie信息将保存cookie文件,浏览器关闭后文件仍然存在,直到设置时间过期将被浏览器自动删除。单位:秒  -- 持久化cookie(保存文件)
删除cookie:保证域名、路径和cookie名称一致情况下,设置 setMaxAge(0) 将删除。

cookie唯一标识:域名、路径、名称
		localhost        /      demo03_cookie_key
		baidu.com		/      mk
		localhost		/day09/a/		cookie_key

3.3 发送中文数据

 cookie 使用http协议请求头和响应头,http协议不支持中文,cookie本身不支持中文的。
 如果cookie value设置中文,服务器将抛异常。
如果cookie需要写入中文,必须手动编码(发送),将编码后结果发送浏览器,之后浏览器返回给服务器仍然编码后的结果,还需要手动解码(获取)。
JDK提供工具,进行编码
URLEncoder:编码
URLDecoder:解码

//编码
String str = URLEncoder.encode(“屌中屌”, “UTF-8”);
System.out.println(str); //%E5%B1%8C%E4%B8%AD%E5%B1%8C
//解码
String value = URLDecoder.decode(str, “UTF-8”);
System.out.println(value);

3.4 cookie案例1:记住用户名

  1. 表单可以提交(文本框、复选框) —下次浏览时,如果曾经记录应该将记录用户名显示到文本框中。
    表单必须是servlet输出,不能是html页面,否则文本框不能显示记录数据。(除非jsp)
  2. 点击提交,编写servlet处理(是否勾选)
  3. 如果勾选,记录用户名(记录数据下次还可以访问,所以cookie,持久cookie setMaxAge(…))
    4.如果没有勾选,删除cookie,注意:唯一标识(域名、路径、名称),cookie必须再次发送到浏览器。

扩展:将UrlEncoder 和 UrlDecoder 结合使用(解决中文用户名)

3.5 cookie案例2:历史记录

  1. 点击查询所有商品
  2. 通过id查询商品详情 – 应该记录浏览记录
  3. 查询所有的浏览记录,显示记录数据

4 session

经典应用:用户登录、JD购物车等
一次会话中,服务器用于共享数据技术。
默认情况:session需要基于cookie使用。及没有cookie session无效。
当第一次调用 request.getSession() ,tomcat将创建一个session对象,并将session对象id值,以cookie方式发送给浏览器,之后浏览器再次请求时,将session id 发送服务器,服务器通过request.getSession() 就可以获取之前已经创建好的session对象。
JavaEE规范提供接口:javax.servlet.http.HttpSession 用于描述session对象。
获得session
request.getSession()  获得session,如果没有将创建一个新的。等效request.getSession(true)
request.getSession(boolean) 获得session,true:没有将创建,false:没有将返回null
session属性操作:xxxAttribute
session 也是 servlet 域对象。(3个servlet域对象:ServletRequest、HttpSession、ServletContext)
session生命周期
创建:第一次调用 getSession()
销毁:
	1. 超时,默认30分钟。
		web.xml 
		<session-config>
   			 <session-timeout>30</session-timeout>   单位:分钟
		</session-config>
	2.执行api
		invalidate() 将session对象销毁了。
		setMaxInactiveInterval(int interval) 设置有效时间,单位秒
	3.服务器非正常关闭。(自杀,将JVM马上关闭)
		如果正常关闭,session将被持久化(写入到文件中)
			D:\java\tomcat\apache-tomcat-7.0.53\work\Catalina\localhost\day09\SESSIONS.ser

4.1 URL重写

  • 当浏览器将cookie禁用,基于cookie的session将不能正常工作,每次使用request.getSession() 都将创建一个new session。只需要将session id 传递给服务器session就可以工作的。
  • 通过URL将session id 传递给服务器:URL重写
    手动方式: url;jsessionid=…
    api方式:
    encodeURL(java.lang.String url) 进行所有URL重写
    encodeRedirectURL(java.lang.String url) 进行重定向 URL重写
    如果参数url为空字符不同,其他都一样。
    如果浏览器禁用cooke,api将自动追加session id ,如果没有禁用,api将不进行任何修改。
    注意:如果浏览器禁用cookie,web项目的所有url都需手动重写。否则session将不能正常工作。

5 总结

cookie
浏览器会话技术,用于在浏览器缓存内容,达到数据共享的目的
使用
1.服务器创建对象,添加数据
2.服务器将cookie发送给浏览器
3.浏览器自动携带cookie数据,服务器获得数据。
浏览器携带数据,根据cookie路径设置。
api
setMaxAge 有效时间,0删除,必须保证路径匹配
setPath 设置访问路径
唯一标识:域名、路径、名称
session
服务器端会话技术,用于在服务器共享数据。
session必须使用cookie传递session id,保证多次请求,浏览器可以共享 服务器一个session对象。
如果浏览器禁用cookie,必须进行URL重写。
session生命周期:

javax.servlet.Servlet 接口,servlet必须实现接口
生命周期方法:init(ServletConfig) 、service(ServletRequest,ServletResponse)、destroy()
javax.servlet.GenericServlet 通用servlet实现,与协议无关的。提供快捷访问
javax.servlet.http.HttpServlet http协议实现,
提供 doGet(HttpServletRequest,HttpServletResponse)/doPost 等方法

javax.servlet.ServletConfig servlet 配置封装对象,获得servlet初始化数据,获得servletContext引用。
javax.servlet.ServletContext 上下文对象(servlet管理者),管理资源(获得路径)、web项目共享数据、系统初始化【】

javax.servlet.ServletRequest 通用request封装对象,与协议无关,【】
javax.servlet.http.HttpServletRequest ,与http协议有关封装对象
javax.servlet.ServletResponse / javax.servlet.http.HttpServletResponse

cookie 对象:javax.servlet.http.Cookie
session 对象:javax.servlet.http.HttpSession【】

servlet三个作用域对象
ServletContext 在一个web项目共享数据,可以有多次会话。常用:统计在线人数。
HttpSession,在一次会话共享数据,可以有多次请求。常用:购物车、验证码等
ServletRequest,在一次请求中共享数据,可能涉及多个页面(请求转发)。常用:查询数据

获得ServletContext方法,servletContext引用,tomcat启动已经创建好的。

	this.getServletConfig().getServletContext();
		request.getSession().getServletContext(); //servlet 2.3
		request.getServletContext();  //servlet 3.0 提供新api

6 myeclipse使用技巧

    1. ctrl + shift + t 查询类
    1. ctrl + o 查询所有方法,再按“ctrl + o”提示方法来自哪个类

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/677880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTF-Show密码学:ZIP文件密码破解【暴力破解】

萌新 隐写23 题目内容&#xff1a; 文件的主人喜欢用生日做密码&#xff0c;而且还是个90后。 一、已知条件 在这个题目中&#xff0c;我们有以下已知条件&#xff1a; 文件的主人喜欢用生日做密码 - 这个条件告诉我们&#xff0c;密码可能是一个八位的纯数字密码&#xff0c…

windows服务器——部署PKI与证书服务

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 学习导图 一.PKI 概念 1.PKI体系能够实现的功能 二.公钥加密技术 1.公钥加…

股票量化系统QTYX选股框架实战案例集|大盘跳水,上涨趋势票抗跌-230621

前言 “实战案例个股画像”系列是和大家分享我基于QTYX的选股框架&#xff0c;在实战中选股的应用案例&#xff0c;和大家一起见证QTYX选股框架逐步完善的过程&#xff0c;帮助大家更好地理解QTYX选股框架精髓。 关于QTYX的使用攻略可以查看链接&#xff1a;QTYX使用攻略 首先要…

C++ 面向对象(2)——继承

C 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#xff0c;也达到了重用代码功能和提高执行效率的效果。 当创建一个类时&#xff0c;您不需要重新编写新的数据成员和…

【Python】异常处理 ① ( 异常概念 | 异常处理 | 异常捕获 )

文章目录 一、Python 异常简介1、异常概念2、Python 异常示例 二、Python 异常处理1、异常处理简介2、代码实例 - 出现异常代码3、代码实例 - 出现异常并进行捕获处理 一、Python 异常简介 1、异常概念 Python 异常 是在程序运行过程中发生的错误或问题的表示 ; 出现异常可能会…

【软件设计师暴击考点】面向对象考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

记录好项目D12

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个房屋租赁系统 一、系统介绍 包括管理员、房东、租客三种角色&#…

【小沐学数据库】MongoDB下载、安装和入门(Python)

文章目录 1、简介2、下载和安装2.1 平台支持2.2 MongoDB Community Server2.3 MongoDB Shell2.4 MongoDB Compass2.5 pymongo库 3、概念3.1 数据库3.2 文档(Document)3.3 集合&#xff08;Collection&#xff09;3.4 元数据3.5 数据类型 4、Python代码测试4.1 连接数据库4.2 指…

kafka基础

文章目录 1、什么是消息队列&#xff1f;2、基础架构3、Kafka为什么快4、零拷贝5、Rebalance机制6、kafka如何避免重复消费7、避免消息丢失8、Kafka怎么实现消息的顺序消费9、什么是ISR10、Kafka文件存储机制 1、什么是消息队列&#xff1f; kafka是一个消息队列的中间件&…

ProGuard混淆及R8优化

前言&#xff1a;使用java编写的源代码编译后生成了对于的class文件&#xff0c;市面上很多软件都可以对class文件进行反编译&#xff0c;况且Android开发的应用程序是用Java代码写的&#xff0c;为了很好的保护Java源代码&#xff0c;我们需要对编译好后的class文件进行混淆。…

切底掌握Android中的Kotlin DSL

前言 在这篇文章中&#xff0c;我们将学习如何在您的 Android 项目中编写 Kotlin DSL。 这个文章会很长&#xff0c;所以花点时间&#xff0c;让我们一起来写你的 DSL。我们将讨论以下主题&#xff0c; 什么是简单英语中的 DSL&#xff1f;您使用任何 DSL 吗&#xff1f;为什…

微服务的文件配置

1 基于本地文件配置的痛点 ①修改本地配置文件 需要重启服务 ②viper能监听本地配置文件变动 修改内存中变量的值 貌似可以满足需求 痛点如果实例过多 手动改极有可能出错 很多服务都依赖一个配置 运维可以写脚本批量修改 出问题运维不想背锅 ③ 多语言开发的实例 使用…

ThreadX在mdk(AC5)中的移植

1.ThreadX简介 Threadx是由 Express Logic 公司开发的一款实时操作系统&#xff08;RTOS&#xff09;&#xff0c;2019年被微软收购&#xff0c;成为了微软的一款Azure RTOS。在2020年&#xff0c;ThreadX也加入了开源大军&#xff0c;将ThreadX内核及其各大组件开源免费。 Th…

电赛汇总(一):微控制器以其外围电路模块设计

电赛汇总(一)&#xff1a;微控制器以其外围电路模块设计 这一章节主要详细记录各种常用的微控制器的引脚功能、外围的电路模块等&#xff0c;以便随时查看翻阅。这部分内容出自黄智伟等学者著的《全国大学生电子设计竞赛教程–常用电路模块制作》一书中&#xff0c;感兴趣的朋…

PS2022版本修复打开闪退问题

前言 windows 11 系统最近换了一台电脑&#xff0c;重新装了一批摄影剪辑软件&#xff0c;在使用过程中发现 PS2022 版本一但导入图片就卡死闪退。起初我以为是版本不兼容问题&#xff0c;但是问了一下对应的朋友他们并未出现这种情况。后面我就从百度中开始捞答案&#xff0c…

适用于平坦草原的近地层以上风廓线推算方法

目录 引言1 数据观测和处理1.1 观测实验和仪器1.2 数据处理 引言 本文研究平坦草原近地层之上的风廓线特征&#xff0c;尤其是不同稳定度情况下风随高度的变化&#xff1b;得到适用于本地的粗糙度、边界层高度和地转风的估测方法。 在上述研究的基础上&#xff0c;本文用上述…

如何快速的阅读一本书

B站&#xff1a;【读书方法】读不进&#xff1f;记不住&#xff1f;5分钟教你如何快速高效读书 | 读书会犯的5大错误&#xff01; 1 看着书皮&#xff0c;思考一下自己为什么读这本书&#xff0c;是为了解决什么问题。 2 要看目录&#xff0c;根据目录看一下这本书能不能解决…

0002Java程序设计-SSM协同过滤算法的新闻推荐系统

摘 要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多行业的管理仍是通过人工管理的方式进行&#xff0c;需要在各个岗位投入大量的人力进行很多重复性工作&#xff0c;使得对人力物力造成诸多浪费&#xff0c;工作效率不高等情况&am…

FPGA时序约束--实战篇(读懂Vivado时序报告)

目录 一、新建工程 二、时序报告分析 1、打开时序报告界面 2、时序报告界面介绍 3、时序路径分析 三、总结 FPGA开发过程中&#xff0c;vivado和quartus等开发软件都会提供时序报告&#xff0c;以方便开发者判断自己的工程时序是否满足时序要求。 本文将详细介绍如何读懂…

VLAN基础知识3_VLAN间三层通信(VLANIF接口)

目录 1.VLAN间三层通信简介 2.VLAN间三层通信方式 3.VLANIF接口介绍 4.基于VLANIF接口VLAN间三层通信原理 5.VLAN间三层通信实验 5.1 常用配置命令 5.2 配置步骤 5.3 实验效果 1.VLAN间三层通信简介 VLAN间三层通信是指在VLAN网络中&#xff0c;不同VLAN之间进行IP通信…