会话技术:

 主要是用来传输数据的。按照数据存放的位置进行划分:1)cookie:将数据存放到客户端中,浏览器自动存储2)session:将数据存放在服务器中。

创建Cookie:
cookie 是 servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。
主要api:

Cookie cookie = new Cookie(String cookieName,String cookieValue);
response.addCookie(cookie);//添加到响应中。
//可以写和添加多个cookie
用抓包工具,可以看到响应体中有一个set-cookie
注意:创建完成cookie之后一定要使用response对象将其添加到response中去,不然没用
response.addCookie(cookie);

例:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: CookieName=CookieValue
Content-Length: 0
Date: Mon, 26 Jun 2017 12:34:28 GMT

这个时候再次访问该网站的 时候,浏览器就会默认带上相关的cookie

常用cookieapi
request.getCookies() :获取所有的cookie,返回一个数组
cookie.getName() :获取cookie对象的name值
cookie.getValue() :获取cookie对象的value值
cookie.getPath() :获取cookie对象的里面的path属性

从cookie中获取内容
1)通过request获得所有的Cookie:request.getCookies()

Cookie[] cookies = request.getCookies();
只能通过获取所有cookies的方式进行获取cookies;

2)遍历Cookie数组,通过Cookie的名称获得我们想要的

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//获得所有的cookieCookie[] cookies = request.getCookies();String value = null;if(cookies !=null){//遍历cookies数组,看是否存在需要找的cookiefor (Cookie cookie : cookies) {if(cookie.getName().equals("CookieName")){value = cookie.getValue();}}}if(value != null){//说明之前有来访过response.getWriter().println("欢迎回来");}else{//说明第一次访问response.getWriter().println("欢迎您的第一次来访");}Cookie cookie = new Cookie("CookieName", "CookieValue");response.addCookie(cookie);}

设置cookie属性的api:

1)
setMaxAge(int sec)最大生存时间,秒
注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭时cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里

2)
删除cookie:
setxMaxAge(0);
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间setMaxAge(0)为0的cookie进行覆盖即可

                 Cookie[] cookies2 = request.getCookies();for (Cookie cookie : cookies2) {if(cookie.getName().equals("CookieName")){cookie.setMaxAge(0);}}

3)setPath(“”);
如果不设置,默认路径是从工程的斜线开始到最后一个斜线结束的部分,不包含最后一根斜线
设置路径的时候以工程名开始;
什么时候浏览器会携带符合条件的cookie:只有访问的路径和cookie的路径一致(或者比cookie的路径更精确的时候,就是访问工程的子文件夹的时候)的时候才会携带对应的
手工设置cookie的时候最好是以斜线开头,以斜线结尾。
setPath(“/”):只要访问的是当前域名,就会携带这个cookie

cookie
(cookie可以同名,但是里面的路径要不一致的。否则会覆盖)

cookie注意要点:
1)cookie是不能够跨浏览器的。不同的浏览器都会存储自己的cookie,都有自己的存储的地方。
2)cookie不支持中文(如果硬要存也是可以的)
3)http协议对cookie有规定。不同的浏览器对cookie对存入cookie的数量和大小是有限制的,不尽相同。
如果要存入中文,就按照下述方法做


案例一: 获取用户上次访问时间:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//获取指定名称的cookieCookie cookie = CookieUtils.getCookie(request.getCookies(), "lastTime");//判断是否存在if(cookie != null){//如果存在:取出值,显示出来String value = cookie.getValue();response.getWriter().println("欢迎回家:"+value);}else{//如果不存在:创建一个lastTime的cookie,并响应回去。并显示您是第一次访问。/*cookie = new Cookie("lastTime", new Date().toString());cookie.setPath("/");cookie.setMaxAge(60*60);response.addCookie(cookie);*/response.getWriter().println("欢迎您的第一来访");}cookie = new Cookie("lastTime", new Date().toString());cookie.setPath("/");cookie.setMaxAge(60*60);response.addCookie(cookie);}

格式化日期时间:SimpleDateFormat

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//获取指定名称的cookieCookie cookie = CookieUtils.getCookie(request.getCookies(), "lastTime");//判断是否存在if(cookie != null){//如果存在:取出值,显示出来String value = cookie.getValue();long parseLong = Long.parseLong(value);SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd,hh:mm:ss");String time = format.format(new Date(parseLong));response.getWriter().println("欢迎回家:"+time);}else{//如果不存在:创建一个lastTime的cookie,并响应回去。并显示您是第一次访问。response.getWriter().println("欢迎您的第一来访");}
//         cookie = new Cookie("lastTime", new Date().toString());cookie = new Cookie("lastTime", new Date().getTime()+"");cookie.setPath("/");cookie.setMaxAge(60*60);response.addCookie(cookie);}


session:

 服务器端会话技术,会将用户数据保存在服务器上;session技术依赖于cookie技术;session通常是用来存放用户私有数据的。主要是用来共享数据的。作用:存放私有数据

session工作流程:
浏览器访问服务器,服务器查看浏览器是否携带了ID;
- 若没带:
- 服务器会创建一个session(内存空间),可以操作session,将session的ID(JSESSIONID)返回给浏览器,浏览器将Session的id保存起来(需要依赖cookie)
- 若携带:
- 服务器拿着这个ID,在session池中去找对应的session
- 若没找到:
- 服务器会创建一个session(内存空间),操作session,将Session的id返回给浏览器,浏览器将session的id保存(依赖cookie)
- 若找到:
- 直接操作session,将session的id返回给浏览器,浏览器将session的id保存起来

常用api:

request.getSession();获取一个session调用后,开辟一块空间。返回对应的编号id,下次访问的时候会自动带上这个session
session.setAttribute(name,value);
session.xxxAttribute():
session.invalidate();手动销毁sessionHttpSession session = request.getSession();
session.setAttribute("name","zhangsan");

创建session之后,可以在响应头里面看到如下所示的cookie:
本质上就是返回一个cookie:JSESSIONID

当session创建之后,就是第一次调用了getSession()之后,只要是在session的生命周期之内,本工程项目下面的所有servlet都是可以访问的。

/////////////////////在data1servlet中向session中存放数据
HttpSession session = request.getSession();
session.setAttribute("msg", "这是data1存放的数据");
/////////////////////在data2servlet中从session中取出数据
HttpSession session = request.getSession();
String msg = (String) session.getAttribute("msg");

session的生命周期:
创建:在java代码中第一次调用request.getSession()的时候创建
销毁:1)服务器超时,默认30分钟;在核心配置文件web。xml中搜索session-timeout会查看到默认的session存在时间
2)服务器非正常关闭的时候;(正常关闭的时候不会销毁,会缓存)
3)手动销毁:session.invalidate();
session的作用范围:
作用范围:一次回话


session/request/Servlet三者的区别(三大域对象)

request
创建:请求达到的时候
销毁:响应生成的时候
作用范围;一次请求
作用:在一次请求中传递数据,请求转发中
session
创建:request.getSession()第一次调用的时候
销毁:1)服务器非正常关闭,2)30分钟超时3)手动调用invalidate手动销毁
作用范围:一次回话
作用:存放当前会话私有数据
ServletContext
创建:服务器启动的时候、或者项目加载的时候
销毁:服务器关闭的时候或者项目移除的时候
作用范围:整个web项目
作用:在整个项目中共享共有数据;


一次性验证码:

主要代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//获取用户传入过来的验证码String code = request.getParameter("code");if(code == null || code.equals("") ){response.getWriter().println("请输入验证码");return ;}HttpSession session = request.getSession();String rightCode = (String) session.getAttribute("code");session.removeAttribute("code");//一次性用完后就移除session中该属性,避免重复使用!if(code.equalsIgnoreCase(rightCode)){response.getWriter().println("您输入的验证码正确");}else{response.getWriter().println("您输入错误了");}}

内省:Introspector

//利用内省技术,自写一个BeanUtils方法
//简而言之,就是利用内省技术对提交过来的数据进行赋值,复制到我们的bean类中。

public class RegisterServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取所有参数;这是页面提交过来的参数Map<String, String[]> map = request.getParameterMap();//创建一个userUser user = new User();/*try {//方法一:直接使用BeanUtils来封装参数BeanUtils.populate(user, map);//方法二:利用自己写的BeanUtils方法来封装参数// populate(user, map);System.out.println(user);} catch (IllegalAccessException | InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}*/}public void populate(Object obj,Map<String, String[]> map) throws Exception{//获取beaninfoBeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());//获取属性描述器PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();//遍历属性描述器for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {//获取属性的名称:String name = propertyDescriptor.getName();//去map中获取数据String[] valueArr = map.get(name);//判断是否有值if(valueArr != null){//调用写的方法赋值Method writeMethod = propertyDescriptor.getWriteMethod();writeMethod.invoke(obj, valueArr[0]);}}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

案例: 记录上次访问时间

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");String lastTimeValue = null;String path = null;Cookie[] cookies = request.getCookies();if(cookies !=null){for (Cookie cookie : cookies) {if(cookie.getName().equals("lastTime")){lastTimeValue = cookie.getValue();path = cookie.getPath();}}}if(lastTimeValue != null){long longTime = Long.parseLong(lastTimeValue);SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd,hh:mm:ss");String dateString = dateFormat.format(longTime);response.getWriter().println("欢迎回来,你上次访问时间为:"+dateString);}else{response.getWriter().println("欢迎你的首次光临!");}Cookie cookie = new Cookie("lastTime", new Date().getTime()+"");cookie.setMaxAge(60*60);cookie.setPath("/");response.addCookie(cookie);}

验证码校验: 一次性验证码:

      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");HttpSession session = request.getSession();String rightCode = (String) session.getAttribute("code");String userCode = request.getParameter("code");if(userCode == null || userCode.trim().equals("")){response.getWriter().print("请输入验证码,不能够为空");}else if(!userCode.equalsIgnoreCase(rightCode)){response.getWriter().println("您输入的验证码不正确");response.getWriter().println("您输入的是:"+userCode);response.getWriter().println("正确    的是:"+rightCode);}else{response.getWriter().println("congratulations");}}

Day18-sessioncookie相关推荐

  1. Python学习路程day18

    Python之路,Day18 - Django适当进阶篇 本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣和效 ...

  2. day18 17.c3p0连接池使用

    连接池时间长不用空闲着,dbcp是不回收的,性能可能有些问题.c3p0是可以自动回收.实际开发中c3p的生产力比dbcp强,性能上更强. package cn.itcast.datasource;im ...

  3. Day18 (二)反射

    反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java ...

  4. python合法关键字是_python练习题-day18

    1.匹配一行文字中的所有开头的字母内容 import re s="i love you not because of who you are, but because of who i am ...

  5. 初学python之路-day18

    time时间模块 时间戳(timestamp):time.time() 延迟线程的运行:time.sleep(secs) (指定时间戳下的)当前时区时间:time.localtime([secs]) ...

  6. Java基础day18

    Java基础day18 Java基础day18-字节缓冲流&字符流 1.字节缓冲流 1.1字节缓冲流构造方法 1.2字节流复制视频 2.字符流 2.1为什么会出现字符流 2.2编码表 2.3字 ...

  7. LeetCode算法入门- Multiply Strings -day18

    LeetCode算法入门- Multiply Strings -day18 题目介绍 Given two non-negative integers num1 and num2 represented ...

  8. QT每日一练day18:文件IO

    一.读文件 day18.pro SOURCES += \main.cpp main.cpp #include<QFile> #include<QDebug> int main( ...

  9. 句句真研—每日长难句打卡Day18

    句句真研-每日长难句打卡Day18 参考译文:但研究者认为,如果外部董事在坏消息爆发前就已离开公司,那么他们会更容易避免声誉受损,即便历史记录显示'"错误行为形成时,董事们尚在其职" ...

  10. Python菜鸟入门:day18编程学习

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

最新文章

  1. 苹果广告背景音乐大全【转】
  2. hdu-3015 Disharmony Trees---离散化+两个树状数组
  3. rac下重做控制文件
  4. 布线管理的设计(一)
  5. linux anaconda搜索路径,Anaconda安装及虚拟环境搭建教程(linux)
  6. Oulipo(Hash入门第一题 Hash函数学习)
  7. matlab的findpeak 极点查找
  8. 石、鋏、布~ 最疯狂的打斗场面,莫要错过,iphone手机游戏
  9. 栈-剑指 Offer 30. 包含min函数的栈
  10. 基于支持向量机的新闻分类
  11. 苹果手机温度测试软件,苹果手机测温神器上线啦!
  12. 有道翻译爬虫 js逆向
  13. error: src refspec master does not match any error: failed to push some refs to ‘https://gitee.com/s
  14. RK3399 Android7.1修改系统默认USB功能
  15. 面对困境最大的困难是走出第一步的勇气
  16. 基于经度坐标校正鱼眼图像---python实现
  17. 若依主子表el-table 校验
  18. springCloud Euraka知识讲解、问题解决方案、优化方案
  19. flash8加as2.0制作山寨版flappy bird小游戏
  20. et200sp系统服务器模块,et200sp系统指导书.pdf

热门文章

  1. 神经网络多分类的实现总结
  2. Ubuntu 14.04安装Nvidia显卡驱动以及查看显卡驱动
  3. 今天是我在csdn的1265天
  4. Linux系统安装开源版PyMOL
  5. Android Q 适配,看这篇就妥了
  6. 【Redis】五种数据类型
  7. 论玩镜头的三种境界[转自无忌fruitbear]
  8. 电路b-3—06刘晏辰
  9. 【深度学习】一文读懂机器学习常用损失函数(Loss Function)
  10. Paddle2ONNX最新升级:飞桨模型全面支持ONNX协议啦!