【JAVA WEB】学习笔记——HTTP协议

C/S模式和B/S模式
客户端和服务器

B/S模式:客户端与服务器一问一答(通讯)遵循:HTTP协议

  1. HTTP概念:
    HTTP,(超文本传输协议),它是TCP/IP协议中的一个应用层协议。

  2. HTTP版本:

    • HTTP/1.0
    • HTTP/1.1
    • HTTP-NG 实验室阶段,未投入使用
  3. HTTP1.0的会话方式
    2. 建立消息
    2. 发送请求消息
    2. 回送响应信息
    2. 关闭连接
    (TCP面向连接;UDP不需要连接的)

  4. 浏览器与web服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对于每一个页面的访问,浏览器与web服务器都要建立一次单独的连接

  5. 浏览器到web服务器之间的所有通讯都是完全独立分开的请求和响应对

  6. 支持代理

  7. HTTP请求消息
    这里写图片描述

    • 请求消息的结构
      一个请求行,若干消息头,以及实体内容其中一些消息头是可选的,消息头和实体内容之间要用空行隔开
      例如:
    GET/index.html HTTP/1.1              -请求行
    Accept:*/*                           -|
    Accept-Lauguage:zh-cn                 |
    Connection:Keep-Alive                 |
    Host:localhost                        |--多个消息头
    Referer:http://localhost/index.php    |
    User-Agent:Mozilla4.0                 |
    Accept-Encoding:gzip,deflate         -|  
                                         --一个空行 
    
    
  8. 响应消息
    这里写图片描述

  • 响应消息的结构
    一个状态行,若干消息头,以及实体内容
    其中一些消息头和实体内容是可选的,消息头和实体内容之间要用空行隔开
    例如
    HTTP/1.1 200 OK                        -状态行
    Server.Microsoft-IIS/6.0               -|
    Date: Wed Oct 26  11:20:45 CST 2011     |
    Content-Length:3389                     |-多个消息头
    Content-Type:text/html                  |
    Cache-control:private                  -|
                                           -一个空行
    <html>                                 -|
    <body>                                  |-实体内容
    ……                                    -|
    
    
  1. JAVA访问实例
public class TestHttp {

   public static void main(String[] args) {
   	Socket socket = null;
   	PrintWriter pw = null;
   	BufferedReader br = null;
   	try {
   		socket = new Socket("www.baidu.com",80);
   		System.out.println(socket);
   		
   		pw = new PrintWriter(socket.getOutputStream());
   		
   		pw.println("GET / HTTP/1.1");
   		pw.println("Host:www.baidu.com");
   		pw.println();
   		pw.flush();
   		
   		br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   		String str = br.readLine();
   		while(str != null){
   			System.out.println(str);
   			str = br.readLine();
   		}
   		
   	} catch (IOException e) {
   		// TODO Auto-generated catch block
   		e.printStackTrace();
   	}finally {
   		try {
   			if(pw != null){
   				pw.close();
   			}
   			if(br != null){
   				br.close();
   			}
   			if(socket != null){
   				socket.close();
   			}
   		} catch (IOException e) {
   			// TODO Auto-generated catch block
   			e.printStackTrace();
   		}
   	}
   }
}
  1. HTTP消息的其他细节
  • 响应消息的实体内容就是网页文件的内容,也就是我们在浏览器中使用查看源文件的方式看到的内容(HTML代码)
  • 一个GET方式的请求消息中不能包含实体内容,且没有采用chunked传输编码方式,那么消息头部分必须包含内容长度的字段,否则,客户端和服务器就无法知道实体内容何时结束
  • 在HTTP协议中,还可以使用简单的请求消息和响应消息,他们都没有消息头部分
    • 简单的请求消息只能用于GET方式,且请求行中不用指定HTTP版本号
    • 对于简单的请求消息,服务器返回简单的响应消息,简单的响应消息中只包含实体内容
  1. HTTP消息头
  • 使用HTTP消息头,可以实现HTTP客户端和服务器之间的条件请求应答,消息头相当于客户端和服务器之间的一些暗号指令
    利用消息头可以实现访问统计,例如站长统计,百度统计等
  • 每个消息头包含一个投资端名称,然后每一次是冒号,空格,值,回车和换行符
    例如:Accept-Lauguage:zh-cn
  • 消息头字段名是不区分大小写的,但习惯上将每个单词的第一个字母大写
  • 整个小吸头部分中的隔行消息头可按任何顺序排列
  • 消息头又可以分为通用消息头,请求头,响应头,实体头四类
  • 许多请求头字段都允许客户端在值部分指定多个可接受选项,多个值之间以逗号分隔
    例如:Accept-Encoding:gzip,compress
  • 有些字段你可以出现多次,例如,响应消息中可以包含有多个“Warning”头字段
  1. HTTP请求行与状态行
  • 请求行
    • 格式:请求方式 资源路径 HTTP版本号<CRLF>
      例如:GET /index.html HTTP/1.1
      请求方式:GET,POST,HEAD,OPTIONS,DELETE,TRACE,PUT
  • 状态行
  • 格式 HTTP版本号 状态码 描述文本<CRLF>
    例如:HTTP/1.1 20 OK
  1. 使用GET和POST方式传递参数
  • 在URL地址后面可以附加一些参数

    • URI格式
      协议名://用户名:密码@主机名:端口号/资源路径
      mailto:vwell@vzhang.net
    • URN
      用户名@主机名
    • GET方式
      例如:GET /reg.php?username=v.zhang&password=123456 HTTP/1.1
      特点:传送的数据量有限制,一般限制在1kb以内
    • POST方式
      例如:
      POST /res.php HTTP/1.1
      Host:localhost
      Content-Type: application/x-www-form-urlencoded
      Content-Length:10

    username=v.zhang&password=123456 --实体内容

    特点:传送数据要比GET方式传送大的多

  1. 响应状态码
  • 表示服务器对请求的各种不同处理结果和状态,三位十进制数
  • 响应状态码的典型情况
    • 200(正常)
    • 302/307(临时重定向)
    • 301(永久重定向)
    • 304(未修改)
    • 401(未经授权访问)
    • 404(找不到)
    • 500(服务器内部错误)

HTTPS:HTTP加上加密处理和认证机制。
Client向Server请求建立连接。
Server返回证书(包含公钥)。
Client验证证书有效,生成对称加密的密钥,并用公钥加密发给Server。
Server用私钥解密出密钥,通过密钥跟Client传输数据。

https = http + SSL(后升级为TSL)
https解决三个问题:

加密:对密钥非对称加密。
完整性校验:摘要算法
身份认证:私钥签名+CA证书认证

RSA(非对称加密算法):双方必须协商一对密钥,一个私钥一个公钥。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据, 只有对应的私钥才能解密。

参考:
一个故事
详细

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件的文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值