`
java_mzd
  • 浏览: 584026 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

用java解析HTTP请求报头

阅读更多

这本来是前两天发的一个文章

也不知道为什么

就被管理员弄到问答频道去了

在自己的博客列表中,也找不到该文章了

郁闷死

现在重新发一遍

 

 

在上次WEB项目的总结中

我就已经花了很多时间

总结了HTTP协议

详细的叙述了HTTP请求,应答

并用Telnet自己写过一个HTTP请求



这次

在山寨Tomcat雏形的时候

因为需要服务器端

根据请求的信息

作出相应回应



而请求信息

又都是通过浏览器封装好的

Http请求类型





在服务器端

通过一个客户线程

使用客户线程的输入流

即可完全得到

经过浏览器封装好的

向服务器端发送的信息

源代码如下

Java代码

/** 
 * 传入一个Socket对象,解析出通过该对象传入这个链接中的所有HTTP请求信息 
 * 
 * @param client 
 */ 
private void getRequset(Socket client) { 
 try { 
 InputStream in = client.getInputStream(); 
 InputStreamReader reader = new InputStreamReader(in); 
 BufferedReader bd = new BufferedReader(reader);//三重封装 
 String t = null; 

 while ((t = bd.readLine()) != null) { 
 System.out.println(t); 
 parser(t);//解析每一句的方法 
 } 
 } catch (Exception ef) { 
 ef.printStackTrace(); 
 System.out.println("getRequset error--->"); 
 } 
} 
 






信息如下
GET /index HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; Edition IBIS; zh-cn) Presto/2.6.30 Version/10.63
Host: localhost:81
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive
//注意,此处两行空格也为HTTP请求的一部分







我们又都知道

在Tomcat中

所有的请求信息



我们都已经封装好

放入一个HttpRequest对象中



在我们自己山寨的Tomcat中

因为得到的Http请求是一个字符串

要得到我们需要的信息



也必须对此字符串进行解析

将解析后的字符串放入一个Request对象中



Requst类源码如下

Java代码
public class Request { 
 private String method;// 请求方法 
 private String protocol;// 协议版本 
 private String requestURL; 
 private String requestURI;//请求的URI地址 在HTTP请求的第一行的请求方法后面 
 private String host;//请求的主机信息 
 private String Connection;//Http请求连接状态信息 对应HTTP请求中的Connection 
 private String agent;// 代理,用来标识代理的浏览器信息 ,对应HTTP请求中的User-Agent: 
 private String language;//对应Accept-Language 
 private String encoding;//请求的编码方式 对应HTTP请求中的Accept-Encoding 
 private String charset;//请求的字符编码 对应HTTP请求中的Accept-Charset 
 private String accept;// 对应HTTP请求中的Accept; 


getter() setter() 

}
  





有了用来存放封装后信息的Request类

有了请求信息的字符串

接下来

我们只需要将字符串解析

并且存放在Request对象中



源代码如下


Java代码
/** 
 * 传入HTTP请求中需要解析的某一句 解析该句,并请放入对应的Request对象中 
 * 
 * @param s 
 */ 
private void parser(String s) { 
 if (s.startsWith("GET")) { 
 String method = "Get"; 
 request.setMethod(method); 

 int index = s.indexOf("HTTP"); 
 System.out.println("index--->" + index); 
 String uri = s.substring(3 + 1, index - 1);// 用index-1可以去掉连接中的空格 
 System.out.println("uri--->" + uri); 
 request.setRequestURI(uri); 

 String protocol = s.substring(index); 
 System.out.println("protocol---->" + protocol); 
 request.setProtocol(protocol); 
 } else if (s.startsWith("POST")) { 
 String method = "POST"; 
 request.setMethod(method); 

 int index = s.indexOf("HTTP"); 
 System.out.println("index--->" + index); 
 String uri = s.substring(3 + 1, index - 1);// 用index-1可以去掉连接中的空格 
 System.out.println("uri--->" + uri); 
 request.setRequestURI(uri); 

 String protocol = s.substring(index); 
 System.out.println("protocol---->" + protocol); 
 request.setProtocol(protocol); 

 } else if (s.startsWith("Accept:")) { 
 String accept = s.substring("Accept:".length() + 1); 
 System.out.println("accept--->" + accept); 
 request.setAccept(accept); 

 } else if (s.startsWith("User-Agent:")) { 
 String agent = s.substring("User-Agent:".length() + 1); 
 System.out.println("agent--->" + agent); 
 request.setAgent(agent); 

 } else if (s.startsWith("Host:")) { 
 String host = s.substring("Host:".length() + 1); 
 System.out.println("host--->" + host); 
 request.setHost(host); 

 } else if (s.startsWith("Accept-Language:")) { 
 String language = s.substring("Accept-Language:".length() + 1); 
 System.out.println("language--->" + language); 
 request.setLanguage(language); 

 } else if (s.startsWith("Accept-Charset:")) { 
 String charset = s.substring("Accept-Charset:".length() + 1); 
 System.out.println("charset--->" + charset); 
 request.setCharset(charset); 
 } else if (s.startsWith("Accept-Encoding:")) { 
 String encoding = s.substring("Accept-Encoding:".length() + 1); 
 System.out.println("encoding--->" + encoding); 
 request.setEncoding(encoding); 

 } else if (s.startsWith("Connection:")) { 
 String connection = s.substring("Connection:".length() + 1); 
 System.out.println("connection--->" + connection); 
 request.setConnection(connection); 
 } 

}
  


封装好请求的Request对象后

接下来

我们就来封装进行应答的Response对象
move on~~~
1
1
分享到:
评论

相关推荐

    用java解析HTTP请求报头.doc

    用 Java 解析 HTTP 请求报头 在本文中,我们将学习如何使用 Java 语言解析 HTTP 请求报头。HTTP 请求报头是指客户端向服务端发送请求时所携带的信息,它包含了请求的方法、协议版本、请求 URL、主机信息、代理信息...

    抓取http报头

    ### 抓取HTTP报头:Java实现解析与应用 在现代网络编程中,HTTP协议作为互联网数据通信的基础标准,其重要性不言而喻。掌握如何利用编程语言处理HTTP请求和响应是每个开发者必备的技能之一。本文将深入探讨如何使用...

    报文解析工具类.rar

    - **解析报头**:识别并提取报头中的关键信息,如源IP、目标IP、端口号、协议类型等。 - **解析负载**:根据报文类型和负载格式,进一步解析负载内容,可能涉及解码编码、处理结构化数据等操作。 - **数据处理**...

    原生JAVA读写PLC

    总的来说,使用Java 8进行原生的PLC通信是一个技术挑战,需要理解网络编程、协议解析以及工业控制系统的知识。但通过这样的实现,可以在跨平台的环境中灵活地集成PLC控制功能,而无需依赖特定的操作系统或外部库。

    java_socket服务器给浏览器发信息(1).pdf

    值得注意的是,处理HTTP协议时,我们需要确保遵循其规范,正确构建和解析请求和响应。例如,每个报头都需要以回车换行`\r\n`结束,整个消息以两个连续的回车换行`\r\n\r\n`作为结束标志。对于二进制数据,需要设置...

    java-socket服务器给浏览器发信息.doc

    在处理请求时,服务器会解析请求行和报头,根据请求方法执行相应操作,如GET请求可能需要读取并返回指定资源,POST请求可能需要处理附加的数据。一旦准备好响应,服务器将构造一个HTTP响应消息,包括状态码、报头和...

    Java 远程文件对接

    - 常见的数据封装方式包括使用特定的分隔符(如换行符)、固定长度的报头等。 4. **文件分块传输**: - 对于大文件,可以考虑将其分成多个小块进行传输,以减少内存消耗和提高传输效率。 - 每个文件块传输完毕后...

    java_socket服务器给浏览器发信息.doc

    接着,服务器接收到请求后,解析请求信息,生成HTTP响应并发送回浏览器。响应的基本结构如下: 1. 状态行:包含HTTP协议版本、状态码(如200表示成功,404表示未找到)和状态消息。 2. 响应头:包含服务器信息、...

    计算机网络实验报告(20211010104803).pdf

    - 自制客户端:修改NetClient以发送包含真实HTTP请求报头的数据,连接到目标服务器并接收响应。 - 构造HTTP响应报头:服务器根据客户端请求构造响应报头,完成类似于真实Web服务器的交互。 实验过程中,学生不仅...

    javasocket服务器给浏览器发信息.pdf

    当Java Socket服务器接收到这样的请求时,它解析请求行和报头,然后根据请求的内容生成相应的HTTP响应。响应也遵循固定的格式,包括HTTP版本、状态码(如200表示成功,404表示未找到,503表示服务不可用)和可能的...

    Java和c++的Socket通信如何发送结构体

    在Java中,我们可以使用`java.net.Socket`类来创建客户端连接,而`java.net.ServerSocket`用于服务器端监听连接请求。在C++中,我们可以利用套接字接口(如`socket.h`)来实现相同的功能。 标题中的"Java和C++的...

    javasocket服务器给浏览器发信息[收集].pdf

    4. **处理请求**:解析请求行和头部,决定如何响应。 5. **创建响应**:构建响应字符串,包括状态行、头部和消息实体。 6. **发送响应**:通过`Socket`的`OutputStream`写入响应,并关闭连接。 对于二进制数据(如...

    深入Java Servlet网络编程

    3. 2 使用Java Servlet API进行会话管理 3. 2. 1 HttpSession接口 3. 2. 2 管理会话数据 3. 2. 3 购物车实例 3. 2. 4 会话事件 第4章 生成图像 4. 1 HTTP协议中的MIME类型 4. 2 Servlet向客户端返回MIME类型...

    学号-姓名-计算机网络课程作业0021

    包括应用层组成的三种模式、C/S模式和P2P模式的要点、混合式P2P模式的要点、应用层常用协议的功能、Java TCP socket和UDP socket通信...Java对象序列化、HTTP协议数据单元的请求消息和响应消息的形成、传送和提取等内容...

    restlet 实例

    RESTful架构强调使用HTTP方法(如GET、POST、PUT、DELETE等)来明确表示操作类型,从而简化了客户端与服务器之间的通信。 RESTful设计中的关键概念包括: 1. 资源(Resource):在REST架构中,一切皆资源,每个...

    SpringMVC-手写笔记-附加截图

    标准的HTTP请求报头可以通过注解访问,如@RequestHeader用于获取请求头的属性,而@RequestParam用于获取GET或POST请求的参数。此外,@PathVariable用于RESTful风格的URL中,以获取路径变量的值。对于PUT和DELETE等非...

    echoServer定长包与添加报头版本

    4. 最后,使用socket编程接口(如Java的Socket或Python的socket模块)的`writen`函数(或等效函数)一次性发送整个报文。 接收报文的过程相对复杂: 1. 当接收到数据时,首先读取前四个字节,这四个字节就是长度...

    2022年JavaWeb知识点.docx

    - 用Java语言编写,遵守所有Java语言的语法规则。 - 在服务器端运行,其`.class`文件由服务器调用和执行。 - 需要遵循Servlet API的规范,继承特定类或实现特定接口,并重写特定的方法来处理客户端请求。 #### ...

Global site tag (gtag.js) - Google Analytics