JavaWeb零基础入门之Cookie和Session
学完之后学习JavaWeb零基础入门之Filter过滤器
视频链接:https://www.bilibili.com/video/BV1Y7411K7zz?p=1
参考手册:https://tool.oschina.net/apidocs/apidoc?api=javaEE6
一、会话技术
- 会话:一次会话中包含多次请求和响应
- 注:一次会话表示浏览器第一次给服务器发送请求,会话建立,直到有一方断开为止
- 功能:在一次会话的多次请求间共享数据
- 方式:
- 客户端会话技术:Cookie
- 服务器端会话技术:Session
二、Cookie
1.概念
- 将数据保存到客户端,客户端有了Cookie之后,每次请求都会发送给服务器
- Cookie 翻译过来是饼干的意思。
- Cookie 是服务器通知客户端保存键值对的一种技术。
- 客户端有了 Cookie 后,每次请求都发送给服务器。
- 每个 Cookie 的大小不能超过 4kb
2.Cookie的创建
使用步骤:
- 创建Cookie对象,参数中绑定数据(键值对)
new Cookie(String name, String value); - 客户端向服务器发送请求后,服务器向客户端发送Cookie对象
response.addCookie(Cookie cookie); - 客户端收到Cookie后,再次发送请求时,服务器获取从客户端发来的Cookie对象
Cookie[] request.getCookies(); - 服务器得到Cookie对象后,使用getName与getValue方法得到Cookie对象的数据
- 创建Cookie对象,参数中绑定数据(键值对)
代码演示:演示Cookie的使用步骤
在src下创建CookieTest1.java
@WebServlet("/CookieTest1") public class CookieTest1 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 创建Cookie对象,参数类似键值对Cookie cookie = new Cookie("msg", "hello");//2. 客户端向浏览器发送Cookieresponse.addCookie(cookie);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);} }
在src下创建CookieTest2.java
@WebServlet("/CookieTest2") public class CookieTest2 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//3. 服务器获取Cookie对象Cookie[] cookies = request.getCookies();//4. 服务器获取Cookie对象的值for (Cookie cookie :cookies) {String name = cookie.getName();String value = cookie.getValue();System.out.println("获得的Cookie对象的值:" + name + ":" + value);}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);} }
运行结果:
在浏览器地址栏先输入:http://localhost:8080/MyTest/CookieTest1
后输入:http://localhost:8080/MyTest/CookieTest2
控制台输出:获得的Cookie对象的值:msg:hello
上述程序原理:基于响应头set-cookie和请求头cookie实现
3.服务器如何获取Cookie
服务器获取客户端的Cookie只需要一行代码:req.getCookies():Cookie[]
4.Cookie值的修改
方案一:
//先创建一个要修改的同名(指的就是 key)的 Cookie 对象 //在构造器,同时赋于新的 Cookie 值 Cookie cookie = new cookie("key1","newvalue1"); //调用 response.addCookie( Cookie ) resp.addCookie(cookie);
方案二:
//1、先查找到需要修改的 Cookie 对象 Cookie cookie = CookieUtils.findCookie("key2", req.getCookies()); if (cookie != null) {//2、调用 setValue()方法赋于新的 Cookie 值。cookie.setValue("newValue2");//3、调用 response.addCookie()通知客户端保存修改resp.addCookie(cookie); }
5.浏览器查看Cookie
- 谷歌浏览器查看 Cookie:
火狐浏览器查看 Cookie:
6.Cookie生命控制
Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
setMaxAge()
- 正数,表示在指定的秒数后过期
- 负数,表示浏览器一关, Cookie 就会被删除(默认值是-1)
- 零,表示马上删除 Cookie
代码示例:马上删除一个 Cookie
protected void deleteNow(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException { // 先找到你要删除的 Cookie 对象Cookie cookie = CookieUtils.findCookie("key4",req.getCookies());if (cookie != null) {// 调用 setMaxAge(0);cookie.setMaxAge(0); // 表示马上删除,都不需要等待浏览器关闭// 调用 response.addCookie(cookie);resp.addCookie(cookie); resp.getWriter().write("key4 的 Cookie 已经被删除");} }
7.Cookie有效路径Path的设置
Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。 path 属性是通过请求的地址来进行有效的过滤。
- CookieA path=/工程路径
- CookieB path=/工程路径/abc
请求地址如下:
- http://ip:port/工程路径/a.html
- CookieA 发送
- CookieB 不发送
- http://ip:port/工程路径/abc/a.html
- CookieA 发送
- CookieB 发送
- http://ip:port/工程路径/a.html
代码示例:
protected void testPath(HttpServletRequest req,HttpServletResponse resp)throws ServletException, IOException{ Cookie cookie = new Cookie("path1","path1");//getContextPath() ===>>>>得到工程路径cookie.setPath(req.getContextPath() + "/abc"); //===>>>>/工程路径/abcresp.addCookie(cookie);resp.getWriter().write("创建了一个带有Path路径的Cookie"); }
7.Cookie 练习—免输入用户名登录
LoginServlet 程序:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {String username = req.getParameter("username");String password = req.getParameter("password");if ("wzg168".equals(username) && "123456".equals(password)) {//登录 成功Cookie cookie = new Cookie("username", username);cookie.setMaxAge(60 * 60 * 24 * 7);//当前 Cookie 一周内有效resp.addCookie(cookie);System.out.println("登录 成功");} else {//登录 失败System.out.println("登录 失败");}
}
三、Cookie的细节
- 一次可以发送多个Cookie对象,使用response调用多次addCookie方法即可
- Cookie在浏览器中保存的时间:
- 默认情况下,当浏览器关闭后,Cookie数据被销毁
- 持久化存储:
使用Cookie对象的setMaxAge(int seconds)方法:- 正数:将Cookie数据写到硬盘中存储,参数指定存活的秒数,时间到后,数据失效, 此时间指的是创建cookie后开始计时,并不是关闭浏览器后才开始计时
- 负数:默认情况
- 零:删除cookie信息
- 在Tomcat 8之后Cookie可以存中文,但特殊中文字符仍不支持,建议使用URL编码格式
- Cookie的共享问题:
- 一个Tomcat服务器中,部署了多个web项目,这些web项目cookie的共享说明:
- 默认情况cookie无法共享
- 使用Cookie对象的setPath(String path)方法设置cookie的获取范围:
- 默认情况,参数是web工程路径,只有这个工程才可以访问到,其余工程无法访问
- 如果要共享,可以设置参数为”/” ( /被浏览器解析得到的地址为http://ip:port/ )
- 不同的Tomcat服务器间cookie的共享说明:
使用Cookie对象的setDomain(String path)方法,参数设置为一级域名,则一级域名相同的不同服务器之间Cookie可共享
如:setDomain(“.baidu.com”),则tieba.baidu.com与news.baidu.com等的cookie可共享
- 一个Tomcat服务器中,部署了多个web项目,这些web项目cookie的共享说明:
四、Cookie的特点和作用
- Cookie在客户端存储数据,客户端有了cookie之后,每次发送请求都会把cookie发送给服务器
- 浏览器对单个Cookie有大小限制(4KB),对同一个域名下的总cookie数量也有限制(20个)
- 作用:
- Cookie一般用于存储少量的安全性较低的数据
- 在不登陆的情况下,完成服务器对客户端的身份识别,如没有登录百度账号的前提下打开百度,设置搜索引擎搜索时不提示,以后打开浏览器访问百度时,不会再出现搜索提示框
- 原理:百度服务器将设置的Cookie信息保存到浏览器,下次访问百度时,百度服务器获取浏览器的Cookie,根据Cookie的值决定要不要显示提示框
五、Session的介绍
- 概念:
- Session是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存到服务器端,常用来保存用户登录之后的信息
- Session 就一个接口(HttpSession)。
- Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
- 每个客户端都有自己的一个 Session 会话。
- Session 会话中,我们经常用来保存用户登录之后的信息。
- 快速入门:
- 获取HttpSession对象
HttpSession session = request.getSession();- 第一次调用表示创建Session会话
- 之后调用都是获取前面创建好的Session会话对象
- isNew();
- 判断到底是不是刚创建出来的(新的)
- true 表示刚创建
- false 表示获取之前创建
- 每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。
getId() 得到 Session 的会话 id 值。
- 使用HttpSession对象的方法
- void setAttribute(String name, Object value);
- Object getAttribute(String name);
- void removeAttribute(String name);
- 获取HttpSession对象
六、Session
1.Session 域数据的存取
/**
* 往 Session 中保存数据
* @param req * @param resp
* @throws ServletException
* @throws IOException
*/
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {req.getSession().setAttribute("key1", "value1");resp.getWriter().write("已经往 Session 中保存了数据");
}/**
* 获取 Session 域中的数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {Object attribute = req.getSession().getAttribute("key1");resp.getWriter().write("从 Session 中获取出 key1 的数据是:" + attribute);
}
2.Session 生命周期控制
public void setMaxInactiveInterval(int interval)
- 设置 Session 的超时时间(以秒为单位),超过指定的时长, Session 就会被销毁。
- 值为正数的时候,设定 Session 的超时时长。
- 负数表示永不超时(极少使用)
public int getMaxInactiveInterval()
获取 Session 的超时时间public void invalidate()
让当前 Session 会话马上超时无效。Session 默认的超时时间长为 30 分钟。 因为在 Tomcat 服务器的配置文件 web.xml 中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长为:30 分钟。
<session-config> <session-timeout>30</session-timeout> </session-config>
如果你想只修改个别 Session 的超时时长。就可以使用上面的 API。
setMaxInactiveInterval(int interval)
来进行单独的设置。Session 超时的概念介绍:
示例代码:
设置当前 Session3 秒后超时
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {// 先获取 Session 对象HttpSession session = req.getSession();// 设置当前 Session3 秒后超时session.setMaxInactiveInterval(3);resp.getWriter().write("当前 Session 已经设置为 3 秒后超时"); }
Session马上被超时示例:
protected void deleteNow(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException {// 先获取 Session 对象HttpSession session = req.getSession();// 让 Session 会话马上超时session.invalidate();resp.getWriter().write("Session 已经设置为超时(无效)"); }
3.浏览器和 Session 之间关联的技术内幕
Session技术,底层其实是基于Cookie技术来实现的。
七、表单重复提交之-----验证码
表单重复提交有三种常见的情况:
- 提交完表单。服务器使用请求转来进行页面跳转。这个时候,用户按下功能键 F5,就会发起最后一次的请求。 造成表单重复提交问题。解决方法:使用重定向来进行跳转
- 用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败, 就会着急,然后多点了几次提交操作,也会造成表单重复提交。
- 用户正常提交服务器。服务器也没有延迟,但是提交完成后,用户回退浏览器。重新提交。也会造成表单重复提交。
八、谷歌 kaptcha 图片验证码的使用
谷歌验证码 kaptcha 使用步骤如下:
导入谷歌验证码的 jar 包 kaptcha-2.3.2.jar
在 web.xml 中去配置用于生成验证码的 Servlet 程序
<servlet><servlet-name>KaptchaServlet</servlet-name><servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>KaptchaServlet</servlet-name> <url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping>
在表单中使用 img 标签去显示验证码图片并使用它
<form action="http://localhost:8080/tmp/registServlet" method="get">用户名:<input type="text" name="username"><br>验证码:<input type="text" style="width: 80px;" name="code"><img src="http://localhost:8080/tmp/kaptcha.jpg" alt="" style="width:100px;height:28px;"><br><input type="submit" value="登录"> </form>
在服务器获取谷歌生成的验证码和客户端发送过来的验证码比较使用。
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {// 获取 Session 中的验证码String token = (String)req.getSession().getAttribute(KAPTCHA_SESSION_KEY);// 删除 Session 中的验证码req.getSession().removeAttribute(KAPTCHA_SESSION_KEY);String code = req.getParameter("code");// 获取用户名String username = req.getParameter("username");if (token != null && token.equalsIgnoreCase(code)) {System.out.println("保存到数据库:" + username);resp.sendRedirect(req.getContextPath() + "/ok.jsp");} else {System.out.println("请不要重复提交表单");} }
切换验证码:
// 给验证码的图片,绑定单击事件 $("#code_img").click(function () {// 在事件响应的 function 函数中有一个 this 对象。这个 this 对象,是当前正在响应事件的 dom 对象// src 属性表示验证码 img 标签的 图片路径。它可读,可写// alert(this.src);this.src = "${basePath}kaptcha.jpg?d=" + new Date(); });
运行结果:每次点击验证码的图片都会变成新的验证码,并将新验证码保存到session域中
九、本次需要的jar包
链接: https://pan.baidu.com/s/1gIZ648FWNpkJY5PCFkEZJw 密码: vbnk
JavaWeb零基础入门之Cookie和Session相关推荐
- 五万字15张导图Java自学路线,小白零基础入门,程序员进阶,收藏这篇就够了
本文收录于<技术专家修炼> 文中配套资料合集 路线导图高清源文件 点击跳转到文末点击底部卡片回复「资料」领取 哈喽,大家好,我是一条~ 最近粉丝问我有没有Java自学路线,有了方向才能按图 ...
- PHP工程师零基础入门到就业班
├─01.PHP小白零基础入门 │ ├─01.步骤一:网页搭建入门 │ │ ├─01 html │ │ │ 1-1 html准备工作.mp4 │ │ │ 1-2 选择 ...
- 零基础入门jQuery视频教程
零基础入门jQuery最新版开发.NET富客户端应用(选择器.DOM操作.事件和动画.Ajax应用.插件.Mobile) 课程分类:.NET+Jquery 适合人群:初级 课时数量:35课时 用到技术 ...
- 零基础入门深度学习(3) - 神经网络和反向传播算法
无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...
- 视频教程-20年Nodejs教程零基础入门到项目实战前端视频教程-Node.js
20年Nodejs教程零基础入门到项目实战前端视频教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/java/python,专注于服务 ...
- python 二进制流转图片_Python零基础入门到精通-5.1节:Python程序的执行过程
教程引言: 系统地讲解计算机基础知识,Python的基础知识, 高级知识,web开发框架,爬虫开发,数据结构与算法,nginx, 系统架构.一步步地帮助你从入门到就业. 5.1.1 在命令行中执行Py ...
- 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA
[JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...
- 【组队学习】【24期】零基础入门语音识别(食物声音识别)
零基础入门语音识别(食物声音识别) 开源内容: https://github.com/datawhalechina/team-learning-nlp/tree/master/FoodVoiceRec ...
- 【组队学习】【23期】Datawhale零基础入门数据挖掘(心跳信号分类)
零基础入门数据挖掘(心跳信号分类) 开源内容:https://github.com/datawhalechina/team-learning-data-mining/tree/master/Heart ...
最新文章
- CentOS(5.8/6.4)linux生产环境若干优化实战
- 【虚拟化实战】Cluster设计之一资源池
- 程序清单8-9 回送所有命令行参数和所有环境字符串
- VC学习笔记:文本图形
- 折叠屏究竟是不是智能手机的未来?| 畅言
- Groovy入门教程
- 视听说加速器_腾讯加速器台服专享加速线路已开通,多款手游一键即可免费加速!...
- 阿里云服务器搭建ftp服务器
- ITIL4 讲解:可用性管理
- 历代iPhone的分辨率
- C++表达式语句实训 对 26 个大写英文字母进行循环加密,输入一个大写英文字母(明文)和一个整数秘钥,输出用秘钥对该大写英文字母加密后的结果(密文)。
- 树莓派与笔记本电脑连接屏幕共享(通过热点)
- Shell中declare -A的用法?
- Netflix如何在上万台机器中管理微服务?(史上最全)
- visio取消英文首字母大写
- 从开始到验收:我做外包项目测试的经验总结
- 文件下载成excel
- 关于python使用playsound播放音频:指定的设备未打开,或不被 MCI 所识别。
- JSP中按钮点击事件不能调用JS方法
- 【netbox怎么用?】netbox的使用方法及运行asp教程
热门文章
- 计算机应用文摘 2008年12月下 第24期
- OpenCV计算物体的重心坐标(2值图像)
- sqlserver卸载及重装到其他盘
- 【图像分割】基于FLICM算法实现图像分割含Matlab源码
- android开发c s架构,【开源】基于C/S架构的Android员工增删改查客户端
- Clickhouse 官方测试数据集之SSB
- Content-Type为“multipart/form-data“是什么意思?
- 机器学习-非监督学习
- 华为云 x 一粒云,让企业云盘不一样
- reshape [] matlab,matlab之reshape函数