会话技术:
会话是什么?
浏览器和服务器交互,浏览器打开网页访问服务器,会话开始,正常交互.
浏览器关闭,会话结束.
会话能干什么?
会话可以共享数据.
Cookie和session将数据保存在不同的位置 进行数据共享

Cookie入门案例

1.创建一个cookie对象
a. Cookie cookie = new Cookie(String name,String value);
2.响应给浏览器
a.Response.addCookie(cookie)
3.再次请求时需要获得cookie
a.Request.getCookies() 获得的是数组(包含所有的cookie,如果没有cookie,返回值为null)
4.Cookie.getName() 获得名称 cookie.getValue() 获得值

Cookie原理--会话级别cookie
Http中头信息进行数据传输
Cookie默认是会话级别的cookie,浏览器打开访问服务器 ,交互的时候数据共享,当前浏览器关闭的时候数据失效.

Cookie细节--持久化级别的cookie

以后开发需要设置时间(cookie的存活时间)
Cookie.setMaxAge(秒)
以后开发需要设置路径(访问路径)(作用:cookie 作用域 如果请求地址栏跟cookie文件里cookie路径一致 自动携带)
Cookie.setPath("/") (作用:表示该服务器下所有的项目允许共享cookie)

6)如果不设置cookie的有效存活时间,默认cookie只在内存中有效,当程序结束后,内存中的cookie销毁,不会写入浏览器的缓存中,因此,
需要为cookie设置一个有效的时间,当程序运行完毕后,会将该cookie写入浏览器的缓存中,即硬盘中保留。如果cookie的存活时间为0,
就相当于浏览器将删除cookie删除或无效.
7)在默认情况下,day08web应用的cookie只能被day08web应用的动态资源访问,如果要让其它的web资源访问,得设置cookie.setPath("/day08-2"),默认cookie的path为当前web应用。
8)cookie是以文本文件的方式存于浏览器缓存中,而且里面的内容明码.

cookie细节:(面试)
1.cookie的value不可以为中文(因为在响应头,响应头在数据传输时,使用是http协议,而协议使用的是iso-8859-1 不支持中文)
2.cookie的设置 遵循4 2 3规则.
2.1:4 表示4kb :设置value的是长度是有限的(精准)
2.2:2 表示20个 : 表示一个网站(站点)最多支持20个cookie(不精准)
2.3:3 表示300个 : 一个浏览器最大存放cookie是300个(不精准)

案例:记录本次登录时间,显示上次访问时间

//编码
response.setHeader("content-type","text/html;charset=utf-8");

//2.第二次访问
//2.1获得请求中携带的cookie数据
Cookie[] cookies = request.getCookies();
//2.2判断数据是否为空
if(cookies != null) {
for(Cookie cookie : cookies) {
//判断是最后一次访问的cookie
if("lasttime".equals(cookie.getName())) {
response.getWriter().print("您上次访问时间是" + cookie.getValue());
//重新赋值
//1.第一次访问
//1.1创建一个cookie
Cookie cookie1 = new Cookie("lasttime",new Date().toLocaleString());

//1.1.1 设置最大存活时间
cookie1.setMaxAge(60*60);
//1.1.2设置路径
cookie1.setPath("/");

//1.2将cookie响应给浏览器
response.addCookie(cookie1);
}
}
}else {
//1.3打印第一访问
response.getWriter().print("您是第一次访问服务器");
//1.第一次访问
//1.1创建一个cookie
Cookie cookie = new Cookie("lasttime",new Date().toLocalString());

//1.1.1设置最大存活时间
cookie.setMaxAge(60*60);
//1.1.2设置路径
cookie.setPath("/");

//1.2将cookie响应给浏览器
response.addCookie(cookie);
}

Session的底层基于cookie,cookie只用于保存id,服务器根据id去找session对象
过程:
1.服务器第一次调用getSession()将创建一个Session对象,并且会给这个session对象赋值唯一的id属性sessionld = 1234.
2.session的底层创建一个cookie对象,目的sessionid传给浏览器 new Cookie(jsessionid,1234),浏览器端会自动保存jsessionid
3.下一次再次请求时,自动携带jsession=1234,服务器第二次调用getSession()根据session获得唯一的session对象.
总结:session的底层基于cookie

Session生命周期:

问题:如果浏览器端禁用cookie session能否使用?
session生命周期
session的底层基于cookie,使用的是会话级的cookie,浏览器关闭cookie,但session还是存在服务器,只是因为cookie丢了,所以session找不回来了.

创建:
1.第一次调用request.getSerssion()时创建.
销毁:
2.1:超时30分钟自动销毁,tomcat配置可以修改(路径在:tomcat -- conf -- web.xml)
例如:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
2.2 手动调用 session.invalidate()销毁.或者setMaxInactiveInterval(int interval)(不常用)
2.3 服务器非正常关闭.
开启服务器后,点击了Console的红色按钮.

session如何持久化?
将sessionid保存到数据库或者可以在浏览器端将cookie持久化.

作用域对象总结:

数据共享:Servlet中的域对象.
类型ServletRequest HttpSession ServletContext
对象request session ServletContext

api:
setAttribute(String name,Object value) :
getAttribute(String name) 返回值Ojbect :
removeAttribute() :

域对象:在一定范围内共享数据.
request:一个请求内多个资源可以共享数据(使用的技术 请求转发)
session:一个会话内共享数据,可以有多个请求.
servletContext : 一个项目内多个会话,多个请求共享同一份数据(全局变量时使用)

以后作用域如何选择?
1.能小不大原则.
2.需求优先原则.

Cookie也可以进行数据共享,但不是域对象,因为指的是服务器端技术.
Cookie和Session关系?如何选择?
Session的底层基于cookie.
如何选择?主要看数据的重要程度.

如果想使用Servlet必须要有tomcat , web中一共13套规范(接口) tomcat支持servlet和jsp

一次性验证码

@WebServlet(urlPatterns={"/BDVerifyCodeServlet"})//等效web.xml配置
public class BDVerifyCodeServlet extends HttpServlet{

// 图片高度
private static final int IMG_HEIGHT = 100;
// 图片宽度
private static final int IMG_WIDTH = 30;
// 验证码长度
private static final int CODE_LEN = 4;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 用于绘制图片,设置图片的长宽和图片类型(RGB)
BufferedImage bi = new BufferedImage(IMG_HEIGHT, IMG_WIDTH, BufferedImage.TYPE_INT_RGB);
// 获取绘图工具
Graphics graphics = bi.getGraphics();
graphics.setColor(new Color(100, 230, 200)); // 使用RGB设置背景颜色
graphics.fillRect(0, 0, 100, 30); // 填充矩形区域

// 验证码中所使用到的字符
char[] codeChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456".toCharArray();
String captcha = ""; // 存放生成的验证码
Random random = new Random();

graphics.setFont(new Font("楷体", Font.BOLD, 20));
for(int i = 0; i < CODE_LEN; i++) { // 循环将每个验证码字符绘制到图片上
int index = random.nextInt(codeChar.length);
// 随机生成验证码颜色
graphics.setColor(new Color(random.nextInt(150), random.nextInt(200), random.nextInt(255)));
// 将一个字符绘制到图片上,并制定位置(设置x,y坐标)
graphics.drawString(codeChar[index] + "", (i * 20) + 15, 20);
captcha += codeChar[index];
}
// 将生成的验证码code放入sessoin中
req.getSession().setAttribute("code", captcha);
// 通过ImageIO将图片输出
ImageIO.write(bi, "JPG", resp.getOutputStream());
}
}

//效验
try{
//编码--
request.setCharacterEncoding("utf-8");
response.setHeader("content-type","text/html;charset=utf-8");

//1.获得
//1.1用户输入的验证码 -- 表单的组件需要有name属性
String verifyCode = request.getParameter("verifyCode");
//1.2获得图片生成的验证码
Object code = request.getSession().getAttribute("code");
//1.3情况session中验证码
request.getSession().removeAttribute("code");
if(code == null) {
//3.1存放错误记录
request.setAttribute("msg","验证码失效");
//3.2请求转发给当前页面form.html
request.getRequestDispatcher("/form.jsp").forward(request,response);
return ;//等效else
}

//2.处理 //equalsIgnoreCase 不区分大小写
if(verifyCode.equalsIgnoreCase(code.toString())) {
//3.响应成功
response.getWriter.prinltn("success");
}else {
//3.失败 请求转发
//3.1存放错误记录
request.setAttribute("msg","验证码错误");
//3.2请求转发给当前页面form.jsp
request.getRequestDispatcher("/form.jsp").forward(request,response);//刷新页面

}

}catch(Exception e) {

}

debug : 里面在Progress窗口下报building和sleeping,那就是编译不过去了.
如果能编译过去,在Project窗口下点击Clean(可以重新编译一个,或者多个),出现Building workspace有绿色条,说明没问题,如果没有
那就是Eclipse挂掉了.解决的办法就是重新启动.

案例:
public class Parent {
public void demo1() {
System.out.println("1");
this.demo2();
//在编译时,this的确表示parent
//但在运行时,表示是son
}
//不可以删,如果删了,编译不过去
public void demo2() {
System.out.println("2");
}
}

public class Son extends Parent {
public void demo1() {
super.demo1();
System.out.println("3");
this.demo2();
}

public void demo2() {
System.out.println("4");
}
public static void main(String[] args) {
Son son = new Son();//new 是谁 this代表谁.
son.demo1();
}

答案:1434
}

更改项目的jdk版本:项目右键 -- Project Facets -- java -- 1.7(改这里) 和 Java Compiler -- JDK -- 1.7(改这里)

JS : 函数问题
//1.函数的声明问题 跟参数没有关系 只要函数名称一样 产生覆盖的效果
//2.函数的调用问题 跟参数没有关系
//3.函数当中有arguments 用来接收所有的数据

function demo2() {
alert(1);
}
function demo2() {
alert(arguments.length);//arguments 表示一个数组,用数组来接收传过来的所有参数值
//arguments.length : 获取的是这个数组的长度
alert(a);

}
demo2("1","2","3");

//$(对象).css("参数") ; 获得 (底层是这么判断的,如果arguments是1表示就一个参数,这样就是表示获得,如果不止一个参数,那就是设置)
//$(对象).css("参数","参数"); 设置

js中遍历;
var arr = new Array("三金","三金","丝巾");
//普通遍历
for(var i = 0;i < arr.length ; i++) {
alert(arr[i]);
}
//增强遍历(forin) foreach(Object obj : 数组) :(var相当于Object;variables相当于索引(或者说是key或者是下标); :相当于in ; 数组相当于arr)
for(var variables in arr) {
alert(arr[variables]);
}
arr["abc"] = "1234";//数组可以使用字符串当下标(数组的属性)
alert(arr["abc"]);
</srcipt>
</head>
<body>
<input id="usernameId" type="text" name="username" value="二斤rose" />

<script>
var userNameObj = document.getElementById("usernameId");
//增强for 可以遍历对象的属性
//现在的userNameObj相当于是一个数组
for(var temp in userNameObj) {
alert(temp);//temp表示属性的key值(例如:type,name,value等等很多)
if(temp == "value") {
//数组名[temp]
alert(userNameObj[temp]);
}
}
</script>
</body>

javaWeb核心技术第八篇之Cookie和Session的更多相关文章

  1. Python爬虫番外篇之Cookie和Session

    关于cookie和session估计很多程序员面试的时候都会被问到,这两个概念在写web以及爬虫中都会涉及,并且两者可能很多人直接回答也不好说的特别清楚,所以整理这样一篇文章,也帮助自己加深理解 什么 ...

  2. Servlet第七篇【Cookie和Session的区别、应用】

    Session和Cookie的区别 从存储方式上比较 Cookie只能存储字符串,如果要存储非ASCII字符串还要对其编码. Session可以存储任何类型的数据,可以把Session看成是一个容器 ...

  3. (进阶篇)Cookie与 Session使用详解

    1.Cookie和Session简介与区别 在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用Cookie与 ...

  4. javaweb回顾第八篇如何创建自定义标签

    前言:在javaweb开发中自定义标签的用处还是挺多的.今天和大家一起看自定义标签是如何实现的. 1:什么是标签 标签是一种XML元素,通过标签可以使JSP页面变得简介易用,而且标签具有很好的复用性. ...

  5. javaWeb核心技术第十篇之Filter

    Web中有三大组件(需要配置web.xml) servlet:服务器端的小程序. Filter(过滤器):运行在服务器,对请求的资源进行过滤,对响应进行包装. 经典案例: 自动登录,网站全局编码,非法 ...

  6. javaWeb核心技术第七篇之HTTP、Tomcat、Servlet、Request和Response

    - Web服务器 - 概念: - web资源: "英文直译"网"的意思 资源:一切数据文件 web资源:通过网络可以访问到的资源,通常指的是一切放在服务器上的文件&quo ...

  7. javaWeb核心技术第六篇之BootStrap

    概述: Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目. 作用: 开发响应式的页面 响应式:就是一个网站能够兼容多个终端 节约开发 ...

  8. javaWeb核心技术第四篇之Javascript第二篇事件和正则表达式

    - 事件 - 表单提交(掌握) "onsubmit" - 单击事件(掌握) "onclick" - 页面加载成功事件(掌握) "onload" ...

  9. javaWeb核心技术第十三篇之Ajax

    Js--ajax--原理解释 概述:异步刷新网页,不会刷新整个页面. Get原理: <%@ page language="java" contentType="te ...

随机推荐

  1. java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)

    CPU:10核 主频100MHz 1核  主频    3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...

  2. minicom配置1500000波特率

    背景 项目需求,得用1500000波特率进行,即1.5M的波特率进行串口通信. 最开始以为minicom不支持,因为第一眼在配置界面的选项中没看见.后来发现其实是支持的 方式一 启动时带参数 -b 1 ...

  3. C#线程学习笔记七:Task详细用法

    一.Task类简介: Task类是在.NET Framework 4.0中提供的新功能,主要用于异步操作的控制.它比Thread和ThreadPool提供了更为强大的功能,并且更方便使用. Task和 ...

  4. django 用户与权限管理

    django中使用content_type表进行存储app与model的关系.在permission表中设立了name(权限的名字,中英文均可)content_type_id(与content_typ ...

  5. 剑指offer笔记面试题2----实现Singleton模式

    题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...

  6. vscode 同步扩展插件

    第一步: 在 VSCode 中,安装用于同步配置的插件 settings sync     第二步:将 VSCode 配置上传到 GitHub 完成这一步需要 GitHub token 和 GitHu ...

  7. 使用百度大脑iOCR,快速自定义机票行程单模板识别

    1. 功能介绍百度已经推出了iOCR财会票据识别,针对财会报销场景提出的专项解决方案,可对各类财务票据.报销单.银行回单.对账单进行自动分类及结构化识别,并支持用户为固定版式的新票据/单据自定义结构化 ...

  8. WebShell代码分析溯源(四)

    WebShell代码分析溯源(四) 一.一句话变形马样本 <?php @$_++;$__=("`"^"?").(":"^"} ...

  9. JVM常用参数详解

     JVM整个堆大小=年轻代大小 + 年老代大小 + 持久代大小,在JDK1.8及之后的版本由于永久代被元空间替代,所以jdk1.8中的堆=年轻代大小 + 年老代大小.本文使用的是JDK1.8  1.堆 ...

  10. MySQL 是如何处理死锁的

    MySQL(InnoDB)是如何处理死锁的 一.什么是死锁 官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁. 这个就好比你有一个人质,对方有一个人质,你们俩去 ...