JavaWeb(B站黑马)学习笔记
目录
前言
JavaWeb(B站黑马)学习笔记 11会话跟踪技术(Cookie&Session)
会话:例如打开京东网站,输入网址,响应京东首页的界面显示,这时会话就建立了,可以继续在首页上进行搜索等操作,在一次会话中多次请求和响应。
会话跟踪:比如用户登录后首页会显示用户名信息,点击其它页面后继续显示,还比如验证码进行验证,显示验证码是一次请求,输入验证码点击登录又是一次请求,要把两个验证码提前出来进行判断也是如此。服务器识别多次请求是否来自于同一浏览器,在同一次会话的多次请求间实现数据的共享,这就是会话跟踪。
会话跟踪技术:HTTP协议是无状态的,每次浏览器向服务器发送请求都视为新的请求,如果HTTP协议是有状态的话,每次请求都会携带前面请求所有的数据,导致后面请求的数据体量很大,而后面的请求速度会很慢,所以HTTP协议被设计成无状态的。因此就需要会话跟踪技术来实现会话内数据共享。
Cookie
基本使用
发送Cookie
浏览器访问后查询Cookie 谷歌浏览器举例:
获取Cookie
先访问aServlet发送Cookie数据,再访问bServlet获取Cookie数据
Cookie原理
是基于HTTP协议实现的,第一次访问Tomcat会在响应数据里加了个响应头set-cookie:username=zs,浏览器在请求时会携带请求头cookie:username=zs,然后通过request对象把所有的数据封装成cookie对象。
Cookie使用细节
cookie存活时间
设置存活时间,到期自动删除
cookie存储中文
cookie不能直接存储中文,如需存储要将中文进行编码,要获取cookie时再进行解码
Session
服务的会话跟踪技术,将数据保存在服务端。cookie是将数据存在客户端浏览器内的,这样数据并不安全。
基本使用
存储到Session中
获取数据,从Session中
浏览器访问
控制台打印
Session原理
上方基本使用中有两个servlet demo1和demo2 他们都获取了Session对象,要实现数据共享就必须确保两个Session对象获取到是同一个。通过打印两个session对象的地址值发现是一模一样的,说明在一次会话的多次请求中来不停的获取Session,不管获取多少次永远都是同一个Session,这样才能实现数据共享。
为什么是一次会话获取的Session是同一个(注:假如有另一个浏览器,QQ浏览器来获取谷歌浏览器的Session就不是同一次会话,或者浏览器全部窗口关闭后重新打开也不是同一次会话),Session是基于Cookie实现的,在demo1中获取Session对象第一次执行(重启服务器首次访问)的时候,这时的Session对象是有一个唯一标识,比如唯一标识id:10,tomcat会把Session的id通过Cookie发送到浏览器,tomcat会在响应的时候加上set-cookie:JESSIONID=10的响应头,客户端浏览器就会收到对应的Cookie的头JESSIONID=10,并把JESSIONID=10存储到浏览器内存里,其实就是一个Cookie。在demo2中再获取Session对象时,会发现携带一个cookie头JESSIONID=10,所以第二次获取会去内存中寻找有没有id:10的Session对象,有的话就直接拿来用,没有就会创建一个。但是通过另一浏览器来获取会发现没有携带cookie头JESSIONID=10,他就获取不到同一个Session。
简单来说就是tomcat在同一次会话会携带一个唯一标识用cookie传递,然后通过第二次请求寻找这个唯一标识来寻找存储数据的Session对象,有同一标识就可以使用同一个Session来共享数据,没有就新建一个。
Session使用细节
区别
案例
登录
Dao&Service层
Web层
登录成功操作细节:
这里登录成功使用重定向而不使用请求转发是因为请求转发传递数据的作用域只在一次请求的过程内有效,跳转到其它页面即失效。把数据存入session中可以实现一次会话请求一次多次响应,可以在显示页面看到***欢迎您 也可以在新增页面看到***欢迎您。注:el表达式就是获取域里的数据,Javaweb中四大域对象 page request session application。所以request.setAttribute("brands",brands);跟session.setAttribute("user",user);都可以通过${}获取出来
记住我功能
细节
判断字符串是否相等,建议把字符串放前面,例如if( "1".equals(remember) ) 因为remember是变量 "1"是常量,这样可以防止空指针异常
注册
Dao&Service层
Web层
页面显示
验证码校验
验证码生成
测试:获取工作目录,设置输出路径,使用CheckCodeUtil.outputVerifyImage生成验证码并 生成图片,打印验证码
验证码显示
修改<img>标签中src路径获取方式为接口获取,接口使用response字节输出流输出图片
细节:点击看不清更换图片 因为src="/11Brand_demo/checkCodeServlet"已经被写入缓存了所以需要传递一个唯一值让每次点击都是不一样的路径
每次刷新页面都会发送一次请求/checkCodeServlet,通过response字节输出流输出图片
校验验证码
注:
该内容是根据B站黑马程序员学习时所记,相关资料可在B站查询黑马程序员最新版JavaWeb基础教程,Java web从入门到企业实战完整版_哔哩哔哩_bilibili