1.重定向和转发
1.1转发
概念:转发一般都是发生在服务器端,由服务器内部进行路径跳转。
特点:
1.用户请求的路径地址不发生变化;
2.转发时可以携带用户信息(request对象);
3.转发时用户的请求 只请求了一次
1.2重定向
说明:由于特殊的业务需求,用户请求服务器时,要求用户自己访问其他的服务器,才能获取结果。
特点:
1.用户请求的路径地址发生变化;
2.重定向时,请求不会携带用户的数据();
3.请求多次,响应多次的,request 对象不是同一个。
2.Spring 内部数据结构
1.数据的结构:Map 理解为容器
2.数据内容:KEY-VALUE
-KEY:一般都是类名的首字母小写,如helloController
-Value:一般存储的都是经过反射等机制实例化的对象
Map<helloController,controller对象>
3.单例:容器中只保存一个对象,spring容器管理对象的生命周期 和容器几乎同生共死
默认:单例对象
多例:如果用户需要使用,则新建一个对象交给用户使用,由用户管理对象的生命周期
3.动态代理与静态代理
3.1代理
代理是一种常用的设计模式,主要解决在直接访问对象时带来的问题,即为其他对象提供一个代理以控制对某个对象的访问;代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。
更通俗的说,代理解决的问题当两个类需要通信时,引入第三方代理类,将两个类的关系解耦,让我们只了解代理类即可,而且代理的出现还可以让我们完成与另一个类之间的关系的统一管理,但是切记,代理类和委托类要实现相同的接口,因为代理真正调用的还是委托类的方法。
3.2动态代理
概念:在不修改源码的条件下对方法进行拓展(在程序运行时运用反射机制动态创建而成)
代理方式:
1.JDK动态代理
1).要求被代理者,必须实现接口.
2).代理对象根据接口的类型,通过反射机制创建出来一个实现类对象.(JDK源码底层实现的)
3).Spring容器一般面对接口注入时 ,默认条件下采用JDK动态代理的方式实例化对象.
2.CGLIB动态代理
1).CGLIB是JDK代理的一种补充.
2).不管被代理者是否实现接口,都可以为其创建代理对象
3).代理对象是被代理者的子类.
3.3静态代理
静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
4.回调地狱
由于ajax多层级嵌套,导致返回值的回调函数解析困难,这种调用称之为回调地狱问题
解决方案:
1.闭包解决,闭包非闭
2.通过promise对象进行封装 (vue对象中解释的)
5.跨域问题说明
5.1浏览器同源策略
概念: 要求请求协议://域名:端口号都相同.
说明: 浏览器解析页面时,当页面中有ajax请求时,则要求页面的URL地址,与Ajax请求的地址必须满足同源策略的规范.
同源策略:
- 请求协议 http:// https://
- 请求域名
- 请求的端口**
上述的三项必须相同. 满足同源策略.浏览器可以解析数据,否则不能正常解析.
5.2同源策略案例
案例练习1:
URL: http://www.jd.com/xxx/xxx
Ajax: https://www.jd.com/xxx/xxx/xxx 协议不同
案例练习2:
URL: http://www.jd.com:80/xxx/xxx 满足要求
Ajax: http://www.jd.com:80/xxx/xxx/xxx
案例练习3: IP与域名对应
URL: http://www.jd.com:80/xxx/xxx 不满足要求 域名不同
Ajax: http://10.0.0.6:80/xxx/xxx/xxx
案例练习4:
URL: http://www.jd.com/xxx/xxx 不满足要求 域名不同
Ajax: http://www.jt.com/xxx/xxx/xxx
3.3跨域
说明: 如果URL地址与Ajax请求路径违反了同源策略,则称为跨域请求.
核心:
1. 浏览器URL地址: http://127.0.0.1:8848/cgb2103/demoWeb/userList.html
2. Ajax请求地址: http://localhost:8090/getUser
该操作不满足同源策略
跨域解决策略
旧的方式: JSONP(了解)
新的方式: CORS 方式
CORS介绍
**跨源资源共享 (CORS) (或通俗地译为跨域资源共享)**是一种基于HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头。
核心: 服务器在响应头中标识可以访问用户的地址. CORS服务端跨域
6.关于servlet说明
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
记录: servlet是java专门针对用户请求而开发的一套传输机制.
Servlet的生命周期
servlet的生命周期就是从servlet出现到销毁的全过程。主要分为以下几个阶段:
加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁
服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf),该servlet对象去处理所有客户端请求,service(ServletRequest req,ServletResponse res)方法中执行,最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。其中加载阶段无法观察,但是初始化、服务、销毁阶段是可以观察到的。
总结:
Servlet的生命周期分为:加载阶段、实例化阶段、初始化阶段、服务阶段、销毁阶段。上面我们说了servlet默认是第一次被访问的时候初始化的,这种情况当用户要使用的时候才创建,也可以在服务器一启动的时候就创建好servlet(这种方式一般不用),要实现这样的操作需要进行配置,在web.xml中进行配置