spring-event

SpringApplicatonEvent 启动过程中的事件处理

Event-Process

ApplicationStartingEvent

  • 应用启动开始时,刚完成SpringApplication的实例化
  • 接着完成如下事:
    • 推断webApplicationType
    • 给字段initilizers赋值:通过SPI方式加载spring.factories中的配置
    • 给字段listeners赋值:通过SPI方式加载监听器
  • 发送ApplicationStartingEvent事件,触发对应的监听器的执行
    • 默认是同步执行
    • 默认的监听器是LoggingApplicationListener、BackGroundPreinitializer

ApplicationEnvironmentPreparedEvent

Environment是Spring的基础元数据。
完成大事记:

  • 封装命令行参数到ApplicationArguments
  • 创建ConfigConfigurableEnvironment实例
  • 发送ApplicationEnvironmentPreparedEvent事件,触发对应的监听器的执行
  • 有九个监听器处理该事件
    • todo

ApplicationContextInitializedEvent

ApplicationPreparedEvent

ApplicationStartedEvent

ApplicationReadyEvent

jvm

Memory

  • NIO Direct Memory
  • native Memory
  • Java 堆

使用Perftools来分析JVM的native Memory分配情况,查看分配结果,
cat pf2.txt | sort -n -r -k4 | more显示每个函数分配的内存

动态代理

  • 字节码创建方式:JDK动态代理通过JVM实现代理类字节码的创建,cglib通过ASM创建字节码
  • 对被代理对象的要求:JDK动态代理要求被代理对象实现接口,cglib要求被代理对象未被final修饰
  • 代理对象创建速度:JDK动态代理创建代理对象速度比cglib快
  • 代理对象执行速度:JDK动态代理代理对象执行速度比cglib快

Tools to analysis

jmap

创建堆转储文件,可通过MAT工具分析

jstat

maven

Maven 学习笔记

设计目标

  • 项目是可重复使用,易于维护、更容易理解的综合模型
  • 工具插件化、可交互

Maven资源库

  • Maven本地仓库, 默认.m2目录
  • Maven中央存储库,maven下载所有依赖的默认位置
  • Maven远程仓库:在pom中添加repo
  • 搜索仓库的顺序:
    1. 在 Maven 的本地仓库搜索 log4j
    2. 在 Maven 中央存储库搜索 log4j
    3. 在 Maven 远程仓库搜索 log4j(如果在 pom.xml 中定义)
1
2
3
4
5
6
 <repositories>
<repository>
<id>java.net</id>
<url>https://maven.java.net/content/repositories/public/</url>
</repository>
</repositories>

TIPS

不执行测试用例

在使用mvn package进行编译、打包时,Maven会执行src/test/java中的JUnit测试用例,有时为了跳过测试,
会使用参数-DskipTests和-Dmaven.test.skip=true,这两个参数的主要区别是:

  • -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
  • -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类

Scope

  • compile 最强依赖,传递
  • provided 参与编译,依赖不传递,不打进包里,由运行时系统提供
  • runtime 运行时,如:JDBC
  • test 编译运行测试代码,不会发布
  • system 类似于provided,但是不会再repo里查找,需要引用外部jar

常用命令

  • mvn compile
  • mvn test-compile 编译测试代码
  • mvn test 运行测试
    • 运行指定测试用力
  • mvn site,package,install,clean
  • mvn eclipse:eclipse
  • mvn idea:idea
  • mvn -Dtest pakcage 只打包不测试
  • mvn jar:jar只打jar包
  • mvn eclipse:clean清除eclipse的一些系统设置
  • mvn validate 验证工程所需资源

Java Web

Servlet简介

Servlet是由Web服务器加载,独立于平台和协议的Java应用程序。JSP改变了Servlet提供HTTP服务时的编程方式。

Servlet的生命周期

  • 加载和实例化
    • Servlet容器加载类
    • 通过反射机制创建实例
  • 初始化
    • 调用Servlet的init方法
    • 每个Servlet实例,只会调用一次init
    • 参数为ServletConfig实例
  • 执行
    • 请求到来,容器针对该请求创建ServletRequest和ServletResponse
    • 调用service()方法
    • 从ServletRequest获取请求信息,处理请求,把处理结果放入到ServletResponse
    • 销毁ServletRequest和ServletResponse
    • service()会检查请求的类型,相应的调用doGet、doPost方法
  • 清理
    • Servlet实例需要从服务中移除时,容器调用destroy方法
    • Servlet的整个生命周期,init和destroy只会调用一次,service()

Servlet相关类和接口

  1. Servlet接口: init、service、destroy、getServletConfig
  2. GenericServlet抽象类 和 HttpServlet抽象类
  3. ServletRequest:getAttribte、getContentLength、getInputStream、getParameter
  4. ServletResponse: getOutputStream、getWriter、setBufferSize、setContentLength
  5. HttpServletRequest:getCookies、getSession
  6. HttpServletResponse: addCookie、setStatus
  7. HttpSession: getId、invalidate(使当前会话失效)、setAttributes、getAttributeNames

web.xml配置

  • webApp自定义web.xml路径:WEB-INF/web.xml
1
2
3
4
5
6
<servlet>
<servlet-name>
<servlet-class>
<servlet-mapping>
<servlet-name>
<url-pattern>

web.xml关键元素说明

  • welcome-file-list:tomcat按顺序查找欢迎页
  • listener: 注册监听器,用于初始化Spring框架
  • error-page:根据error-code或者exception-type指定location

struts.properties

  • 放置在src路径下;编译部署后,位于WEB-INF/classes 路径下
  • 设置国际化编码、devMode、locale、theme等

struts.xml

  • 位置同struts.properties
  • 主要用于配置Action和Http请求的关系
  • package:命名空间定义
  • action

AJAX

Struts简介

Struts框架主要有两个版本: 1.x和2.x,都遵循MVC思想。1.x版本性能高效、低松耦合、低侵入,但存在如下缺点:

  • 耦合
  • 麻烦

2.x版本是一个全新的框架,将Struts技术与WebWork技术结合,功能更加灵活。

Struts 2 工作原理

  1. 用户发出HttpServletRequest
  2. 请求经过一些了的Filter过滤器
    • 集成了SiteMesh插件之后,会先经过ActionContextCleanUp过滤器
  3. 调用FilterDispatcher
    • 控制器的核心
    • 询问ActionMapper是否需要调用Action
    • 如果需要,转发给ActionProxy
  4. ActionProxy通过ConfigurationManager,从struts.xml中获取需要调用的Action类
  5. ActionProxy创建ActionInvocation实例,该实例使用命名模式来调用。 该实例根据配置文件,添加相关的拦截器Interceptor
  6. Action执行完成后,ActionInvocation实例根据strtus.xml中的配置,找到相对应的返回结果
    • 返回结果为JSP或者FreeMaker模版
  7. 最后,HttpServletResponse通过web.xml 文件中配置的过滤器返回

Tips

  • FilterDispatcher对应控制层
    • web.xml 中启用过滤器fd
    • fd根据URL和struts.xml中的配置调用对应的action
  • Action对应模型层
    • 模型层处理请求参数,调用效应的业务逻辑,产生视图所需要的数据
  • Result对应视图层
  • 2.x优点:
    1. 集中配置来调度动作类
    2. 提供简单统一的表达式语言来访问内存数据
    3. 提供标准的验证框架、国际化框架
    4. 强大的标签
    5. 良好的Ajax
    6. 明确的错误报告,异常简单明了

持久化

Java中对象持久化的方式有:

  1. 序列化对象,将对象存放到格式化的文件中
  2. 将对象持久化到xml文件中
  3. 持久化到数据库中,一般为关系型数据库

持久化层框架Hibernate

核心接口:Configuration、SessionFactory、Session、Transaction、Query

  1. 初始化创建Configuration对象
    • 读取Hibernate.cfg.xml存放到Configuration
    • 读取mapping元素到Configuration
  2. 创建SessionFactory(SF)
    • Configuration对象创建SF,把配置信息注入SF
    • SF负责创建Session
    • Configuration使命结束
    • SF是全局唯一的,线程安全的
  3. 创建Session,建立数据库连接
    • Session对象操作实体对象
    • 操作转换为DB中的CRUD
    • session实例不是线程安全的,通过ThreadLocal来保证
  4. 创建Transaction,开始一个事务
    • CDU操作必须包含在事务中
  5. 利用Session的持久化方法将实体对象持久化到DB
    • 设计:DAO接口、DAO实现类、DAO工厂类
    • 接口:save、findById、delete、update
    • 实现:session、transaction
    • 工厂:通过接口使用实现类,解耦使用与实现
      • public static UserDAOInterface getUserDAOInstance(){ return new UserDAOImpl();}
    • SQL语句是在运行时由Hibernate自动生成的
  6. 提交结果并结束事务
  7. 关闭Session,与DB断开连接

hibernate.cfg.xml详解

  • JDBC配置
  • C3P0连接池:
    • Hibernate实现类一个插件结构,可以继承第三方连接池
    • Hibernate提供类对C3P0的内嵌支持
    • 可以配置:最大/小连接数、超时时长、缓存statement数量
  • JNDI数据源
  • 二级缓存属性:
    • 一级缓存是Session级,事务范围级的,由Hibernate自动控制
    • 二级缓存是由SessionFactory管理的进程级缓存,可动态加载和卸载
    • 二级缓存属性:hibernate.cache.provider_class,hibernate.cache.use_query_cache,hibernate.cache.query_cache_factory
  • 事务属性:
    • Hibernate只实现了对JDBC的轻量级封装,本身未提供事务管理
    • 依赖于JDBC或者JTA事务管理功能
    • hibernate.transaction.factory_class指定工厂类

*.hbm.xml详解

  • 映射文件结构
    • hibernate-mapping是根元素,设置子元素类的共有属性
    • class声明一个持久化类
    • id映射标识属性
      • 经验表明自然主键很容易出现问题,一般使用代理主键
      • uuid:长度32位的16进制字符串,由IP、JVM启动时间(精确到1/4秒)、系统时间、JVM中的唯一计数器值生成
    • property元素映射普通属性
    • 映射集合元素
  • 关联关系映射
    • todo
  • Tips:MiddleGen插件可以自动生成类和mapping文件

spring

Spring框架学习笔记

Spring是Java平台上的开源应用框架,起源于Rod Johnson于2002年所著的《Expert One-on-One:J2EE Design and Development》,2003年Rod公开了框架源码,2004年1.0版Spring正式发布。
框架优势:

  • 有效组织中间层对象
  • 实现面向接口编程的范式
  • 易于进行单元测试
  • 简化了数据库访问层

依赖注入与控制反转

传统上,被调用者实例由调用者创建,Spring框架通过依赖注入,使调用者无需关心实例的常见,实现了面向接口编程,达到了控制反转的目的。

面向切面编程

为分散的对象添加公共的行为,通过AOP,完成公共逻辑的统一管理,减少了系统中的重复代码,降低了模块件间的耦合,提高了系统的可维护性。

  • Aspects模块集成了AspectJ
  • Instrumentation模块提供了class instrumentation和classloader实现

主要模块

核心容器[Core Contrainer]

  • Beans、Core
    提供基本功能:创建、配置和管理Bean
  • Context:扩展BeanFactory,提供上下文信息,添加了I18N、资源加载、校验等功能
  • Expression Language:用于访问和操纵运行时对象

AbstractApplicationContext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void refresh() throws BeansException, IllegalStateException {
Object var1 = this.startupShutdownMonitor;//同步锁
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();//为刷新准备新的Context
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();//刷新所有BeanFacotry子容器
this.prepareBeanFactory(beanFactory);//创建BeanFactory

try {
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();//刷新由子类实现的方法
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var5) {
this.destroyBeans();
this.cancelRefresh(var5);
throw var5;
}

}
}

BeanFactory详解

1
2
3
4
5
6
7
8
//Bean Factory 接口
Boolean containsBean(String name) //check Bean existing
Object getBean(String name)
Class getType(String name)
//Application 子接口,扩展附加功能
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext

数据访问

  • ORM模块提供对象关系映射API,集成了JPA、JDO、hibernate、iBatis
  • OXM:提供Object/XML映射抽象
  • JMS模块包含了发布和订阅特性
  • Transaction模块提供了对声明式和编程式事务的支持

Web模块

  • 支持Web、Servlet、Struts、Portlet

Test模块

  • 支持JUnit
  • 支持TestNG

Spring Boot

注解

  • Profile
    • 使用环境中的ActiveProfiles来标明context,从而设置不同的参数
    • @Profile("dev") or @Profile("prod")
    • context.getEnvitonment().setActiveProfiles(“prod”)
  • Application Event
    • 自定义ApplicationEvent
    • 自定义ApplicationListener
    • 使用容器发布事件
  • SpringAware
    • 通过对应的Aware接口,使Bean获取对应的信息
    • BeanNameAware
    • BeanFactoryAware
  • Concurrent
    • ThreadPoolTaskExecutor:实现了一个基于线程池的TaskExecutor
  • Scheduled
    • 定时任务

MyBatis 初探

MyBatis 是一个开源持久化框架,用于简化Java开发中的数据库访问。它支持customer SQL, stored proceduresdifferent types of mapping relations。该框架也是一种交互式框架,先期准备好交互的必要条件,然后构建一个交互环境,在交互环境中划分出会话,每次会话也有一个交互环境。当环境准备好了之后,就可以交换数据来(涉及到网络通信,一般都是这种处理方式)。

主要完成两件事:

  • 通过JDBC完成与数据库的连接
  • 通过反射完成Java对象和数据库参数之间的映射关系

通过SQLMap文件获得statement语句,同时形成ParameterMap和ResultMap两个对象,用于处理参数和SQL对象,这样加上数据库连接,就可以执行SQL语句了。

运行原理(iBatis)

  • SqlMapSession->SessionScode->Establish Connection->RequestScope
  • execute SQL
    • 映射Java对象参数到ParameterMap
    • 映射数据库列到ResultMap
  • RequestScope归还到对象池-释放Connection-归还SessionScope-销毁SqlMapSession

Java APIs

  • SqlMapClientImpl
    • ExtendedSqlMapClient
      • SqlMapClient: 定义客户端的CRUD
        • SqlMapExecutor
        • SqlMapTransactionManager
    • SqlMapSessionImpl
      • SqlMapSession: 提供客户端在当前线程的执行环境
        • SqlMapExecutor
        • SqlMapTransactionManager
  • SqlMapExecutorDelegate: 工具类,耦合了操作和执行环境

Statement相关的类

  • DeleteStatement
  • InsertStatement
  • SelectStatement
  • UpdateStatement
    • GeneralStatement
    • BaseStatement
      • MappedStatement
      • ResultMap
      • Sql
      • ParameterMap

SQLSessionFactory

SQLSessionFactory是MyBatis应用的核心,使用对应的Builder和配置文件来实例化。配置文件中包含了如下信息:

  • data source definition
  • transaction manager details
  • mappers of relations between entities

SQLSession

SQLSession 使用SQLSessionFactory(非线程安全)来实例化,。包含了如下操作:

  • performing database operations
  • obtaining mappers
  • managing transactions

SqlSession实现了AutoCloseableinterface,可以使用如下形式:

1
2
3
try(SqlSession session = sqlSessionFactory.openSession()) {
// do work
}

Maven 依赖

1
2
3
4
5
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>

Mappers

  • CRUD注解:调用被注解的方法,执行对应的SQL
    • @Insert
    • @Select
    • @Update
    • @Delete
  • @Results 设置查询结果与Java类的映射关系
    • @Result
  • @Many
    • @One
  • @MapKey
  • @Options 定义全局的开关和配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface PersonMapper {

@Insert("Insert into person(name) values (#{name})")
public Integer save(Person person);

// ...

@Select(
"Select personId, name from Person where personId=#{personId}")
@Results(value = {
@Result(property = "personId", column = "personId"),
@Result(property="name", column = "name"),
@Result(property = "addresses", javaType = List.class,
column = "personId", many=@Many(select = "getAddresses"))
})
public Person getPersonById(Integer personId);

@Insert("Insert into address (streetAddress, personId
values(#{streetAddress}, #{personId})")
@Options(useGeneratedKeys = false, flushCache=true)
public Integer saveAddress(Address address);
// ...
}

Dynamic SQL

动态生成SQL语句,相对于传统JDBC易于调试,不易出错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//SQL使用
@SelectProvider(type=MyBatisUtil.class, method="getPersonByName")
public Person getPersonByName(String name);

public class MyBatisUtil {

// SQL定义

public String getPersonByName(String name){
return new SQL() {{
SELECT("*");
FROM("person");
WHERE("name like #{name} || '%'");
}}.toString();
}
}

存储过程的调用

结论

参考资料

HTTP 学习笔记

HTTP 协议、安全、应用

HTTP协议,即Hypertext transfer protocol,是 World Wide Web Consortium和Internet Engineering Task Force合作的结果, 是一种WWW服务器之间通信的数据传输协议, 由请求和相应组成,应用于网页等Web应用。
HTTP默认的端口号为80,HTTPS的端口号为443

主要特点

  • 支持B/S模式:支持不同的认证方式
  • 支持不同的消息类型: Content-Type可以指定
  • HTTP v0.9和v1.0使用非连续连接:限制每次链接只处理一个请求; v1.1使用连续连接:一个连接可以传送多个对象
  • 无状态:协议对于事务没有记忆能力
  • HTTP v1.1起,默认开启Keep-Alive,下次请求继续使用已建立的连接; 可以设置保持时间

Example

  • 请求头域与响应头域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET /img/ridox.jpg HTTP/1.1\r\n
HOST: img0.promise.com\r\n
Connection: keep-alive\r\n
\r\n

# 响应
HTTP/1.1 200 ok\r\n
Server: JSPO2/1.0.27\r\n
Connection: keep-alive\r\n
Content-Type:image/gif\r\n
Content-Length: 228\r\n
ETag: "1693457"\r\n
Expires: Fri,18 Jul 2014 05:44:45\r\n
Cache-Control: max-age=604800\r\n
\r\n

请求动作

方法区分大小写,Request Line中是全大写

  • options:服务器返回针对特定资源支持的方法,测试服务请的功能
  • head:^H服务器像^H相应get请求一样返回消息头中的元信息
  • get : 资源请求
  • post:向指定资源发起,可能产生新资源或者资源修改
  • put: 向指定资源位置上传最新内容
  • delete: 让服务器删除URI指定的资源
  • trace: 回显服务器收到的请求,用于测试连接
  • connect: 预留给能够将连接改为管道的代理服务器
  • patch : 用来将局部修改应用于某一资源,添加于规范RFC5789

URL详解

基本格式:schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]

详细例子: http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff

  • schema: http,ftp,https
  • host:IP或者域名
  • port#:使用端口,默认80可以省略
  • url-params
  • query-string
  • anchor

常见使用技巧

  • If-Modified-Since: 请求头,服务器把该时间与文件最后修改时间对比,一致,则返回304, 否则返回200和新的文件内容
  • If-None-Match:请求头,取值为Etag,服务器验证对应的Etag值是否一致,一致,则返回304,否则返回200和新的文件内容
  • Pragma:请求头,取值no-cache,表示服务器必须返回刷新后的文档,即使(代理)服务器已经有了本地拷贝
  • Cache-Control: 取值包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage
    Authorization:授权信息 Range:请求实体的一个或者多个子范围,但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)
    • 表示头500个字节:bytes=0-499
    • 表示第二个500字节:bytes=500-999
    • 表示最后500个字节:bytes=-500
    • 表示500字节以后的范围:bytes=500-
    • 第一个和最后一个字节:bytes=0-0,-1
    • 同时指定几个范围:bytes=500-600,601-999
  • Allow: 服务器支持的请求方法(如Get)
  • Set-Cookie:服务器返回的Cookie;每写入一个,就生成一个Set-Cookie
  • ETag: 配合If-None-Match使用
  • Last-Modified:使用setDataHeader设置
  • Server:服务器软件信息
  • Location:重定向位置,通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。Location响应报头域常用在更换域名的时候。
  • Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计
  • WWW-Authenticate:该响应报头域必须被包含在401(未授权的)响应消息中
  • 保存请求状态的方法:
    • 通过Cookies
    • 通过Session
      • 利用Cookie保存JSESSIONID
      • 使用URL回写
      • 通过表单变量
      • 通过QueryString
  • telnet测试HTTP:
    • telnet www.baidu.com 80

状态码

  • 1** 信息类
    • 100 客户继续发送请求
    • 101 转换HTTP协议版本
  • 2** 响应成功,被理解、接收、接受
    • 200 完成
    • 201 提示知道新文件的URL
    • 202 接受和处理,但处理未完成
    • 203 返回信息不完善
    • 204 请求收到,但返回消息为空
    • 205 服务器已完成请求,用户代理必须复位当前已浏览过的文件
    • 206 服务器已完成了部分用户的get请求
  • 3** 重定向 为了完成指定动作,必须进一步处理
    • 300 请求的资源可在多处获得
    • 301 本网页被永久性转移到另一个URL
    • 302 请求的网页被转移到一个新的URL,但客户仍继续通过原URL访问,新的URL会在response的location中
    • 303 建议客户访问其他URL
    • 304 网页内容未改,缓存继续使用
    • 305 请求的资源必须从服务器指定的地址得到
    • 306 前一版本HTTP中使用的代码,现行版本中不再使用
    • 307 申明请求的资源临时性删除
  • 4** 客户端错误类 请求包含错误语法,或者不能正确执行
    • 400 客户端请求有语法错误,不能被服务器理解
    • 401 请求未授权,这个状态必须与WWW-Authenticate报头一起使用
      • 401.1 未授权,登陆失败
      • 401.2 未授权,服务器配置问题导致登陆失败
      • 401.3 ACL禁止访问资源
      • 401.4 未授权:授权被筛选器拒绝
      • 401.5 未授权:ISAPI或者CGI授权失败
    • 402 保留有效ChargeTo 头响应
    • 403 禁止访问,服务器收到请求,但是拒绝提供服务
      • 403.1 禁止可执行访问
      • 403.2 禁止读访问
      • 403.3 - 禁止访问:禁止写访问
      • 403.4 - 禁止访问:要求 SSL
      • 403.5 - 禁止访问:要求 SSL 128
      • 403.6 - 禁止访问:IP 地址被拒绝
      • 403.7 - 禁止访问:要求客户证书
      • 403.8 - 禁止访问:禁止站点访问
      • 403.9 - 禁止访问:连接的用户过多
      • 403.10 - 禁止访问:配置无效
      • 403.11 - 禁止访问:密码更改
      • 403.12 - 禁止访问:映射器拒绝访问
      • 403.13 - 禁止访问:客户证书已被吊销
      • 403.15 - 禁止访问:客户访问许可过多
      • 403.16 - 禁止访问:客户证书不可信或者无效
      • 403.17 - 禁止访问:客户证书已经到期或者尚未生效
    • 404 客户端连接到服务器,但是服务器无法取得所请求的网页
    • 405 用户在Request Line请求的方法不存在
    • 406 根据用户发送的Accept,请求资源不可访问
    • 407 类似401,用户必须在代理服务器上的到授权
    • 408 客户端没有在用户指定的时间内完成请求
    • 409 对当前的资源状态,请求不能完成
    • 410 服务器上不再用此资源,且无进一步的参考地址
    • 411 服务器拒绝用户定义的Content-Length请求
    • 412 一个或多个请求头字段错误
    • 413 请求的资源大于服务器要求的大小
    • 414 请求的资源URL长于服务器允许的长度
    • 415 请求资源不支持请求项目格式
    • 416 请求包含Range字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
    • 417 服务器不能满足Expect请求头指定的值
  • 5** 服务端错误类 服务器不能正确执行一个正确的请求
    • 500 服务器遇到错误,无法完成请求
      • 500.10 内部复位器错误 ASP错误
      • 500.11 服务器关闭
      • 500.12 服务器重启
      • 500.13 服务器太忙
      • 500.14 应用程序无效
      • 500.15 不允许请求global.asa
    • 501 未实现
    • 502 BadGateway 网关错误
    • 503 由于超载或者停机维护,服务器目前无法使用,一段时间后可能恢复正常
    • 504 GateWay Timeout 服务器作为代理,未及时从上游服务器获得响应
    • 505 Http Version Not Supported

应用

  • 断点续传
    • GET请求支持只请求某个资源的某一部分,Range 指明请求资源范围
    • 206 Partial Content 部分内容响应
    • Content-Range 响应的资源范围
    • 在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传
    • 分块请求资源实例
    • Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分
    • Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节
    • 客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的
    • 目前流行的FlashGet和迅雷基本都是这个原理
  • 多线程下载
    • 下载工具开启多个发出HTTP请求的线程
    • 每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000
    • 合并每个线程下载的文件
  • http代理
    • 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息
    • 代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器
    • 大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率
    • Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。
    • 主要功能:
      • 突破自身IP访问限制,访问国外站点。如:教育网、169网等网络用户可以通过代理访问国外网站;
      • 访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务;
      • 突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国外的代理服务器试试;
      • 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度;
      • 隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击

认证方式

基本认证

  • HTTP请求报头: Authorization
  • HTTP响应报头: 认证失败-》WWW-Authenticate;认证成功返回指定内容
  • Oauth认证:增强版,放在Authorization中的token使用了更强的加密算法
  • 阮一峰讲 Oauth
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 请求服务器使用基本认证保护资源
GET /private/index.html HTTP/1.0
Host: localhost
# 应答
HTTP/1.0 401 Authorization Required
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:18:15 GMT
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
Content-Length: 311
# 客户端加上用户名密码后重新请求,浏览器使用BASE64Encode(UserName:PassWork)生成token
GET /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
# 服务器认证通过,返回请求内容
HTTP/1.0 200 OK
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:19:07 GMT
Content-Type: text/html
Content-Length: 10476

摘要认证

  • Http1.1开始提供
  • 引入安全增强选项:qop
  • HA1 = MD5(A1) = MD5(username:realm:password)
  • qop = auth or undefined: HA2 = MD5(A2) = MD5(method:digestURI)
  • qop = auth-int : HA2 = MD5(A2) = MD5(method:digetURI:MD5(entityBody))
  • qop = auth or auth-int: response = MD5(HA1:nonce:nonceCount:clientNone:qop:HA2)
  • qop = undefined: reponse = MD5(HA1:nonce:HA2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#客户端请求 (无认证):
GET /dir/index.html HTTP/1.0
Host: localhost
#服务端返回401
HTTP/1.0 401 Unauthorized
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:26:47 GMT
WWW-Authenticate: Digest realm="testrealm@host.com",//认证域
qop="auth,auth-int", //保护质量
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", //服务器密码随机数
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Content-Type: text/html
Content-Length: 311
#客户端重新发出请求 (用户名 "Mufasa", 密码 "Circle Of Life"):
GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Mufasa",
realm="testrealm@host.com",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
uri="/dir/index.html",
qop=auth,
nc=00000001, //请求计数
cnonce="0a4f113b", //客户端密码随机数
response="6629fae49393a05397450978507c4ef1",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
#服务器响应:
HTTP/1.0 200 OK
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:27:03 GMT
Content-Type: text/html
Content-Length: 7984

HTTPS 原理

  • Hypertext Transfer Protocol over Secure Socket Layer: HTTPS的基础上SSL
  • 两种基本加密类型:
    • 对称加密:使用一个密钥,加解密速度快,例子:DES、AES
    • 非对称加密:密钥和公钥成对出现=》密钥加密,公钥解密;公钥加密,密钥解密

Https过程如下:

①客户端发起SSL通信,报文中包含客户端支持的SSL的指定版本,加密组件列表(加密算法及密码长度)

②服务端通过SSL通信,将SSL版本及加密算法版本中的一组发送至客户端.

③服务端发送客户端Certificate报文,报文中包含公开密钥证书.

④客户端验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示;
如果证书受信任,或者用户接受了不受信的证书,客户端会生成一个Pre-master secret的随机密码串,并且通过接受到公钥加密.

⑤服务端会通过私钥解密出Pre-master sercret随机密码串,通过Pre-master sercret解密密发来的握手信息,并验证Hash是否与浏览器发来的一致.之后通过密码加密一段握手信息,发给客户端.

⑥客户端解密并计算握手信息的Hash,如果与Server发来的Hash一致,此时握手过程结束,利用对称加密算法进行加密.

参考地址