`
java_mzd
  • 浏览: 580398 次
  • 性别: 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请求报头

    HTTP 请求报头详解

    HTTP头字段包括4类: general-header ; request-header ; response-header ; entity-header

    Python使用requests发送POST请求实例代码

    服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括: application/x-www-form-urlencoded 最常见post提交数据的方式,以form...

    HTTP协议之消息报头

    详细介绍了HTTP协议之消息报头中各个属性。

    http报头for Arduino

    http报头for Arduino生成工具

    C#如何解析http报文

    要解析HTTP报文,需要实现以下操作: 读取HTTP报头提供的各种属性 分析属性值,从中获取内容编码和字符集编码 将报头数据和内容进行分离 判断内容是否文本还是二进制,如果是二进制的则不进行处理 如果内容是文本,...

    为HttpClient添加默认请求报头的四种解决方案

    主要给大家介绍了关于为HttpClient添加默认请求报头的四种解决方案,文中通过示例代码介绍的非常详细,对大家学习或者使用HttpClient具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    IP报头结构实验

    科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 ...

    linux pcap 报文 解析 报头剥离

    将pcapedit 和 配置文件放到用一路径下,处理处的结果文件保存在当前路径。 [root@localhost cll]# ./pcapedit Input the pcap file name:3g_ctrl_data.pcap //符合帧格式的pcap文件处理结果 starting parse pcap ...

    Python小白学习爬虫常用请求报头

    客户端HTTP请求 URL只是标识资源的位置,而HTTP是用来提交和获取资源。客户端发送一个HTTP请求到服务器的请求消息,包括以下格式: 请求行、请求头部、空行、请求数据 一个典型的HTTP请求 GET ...

    抓取http报头

    用java写的一个抓取http报头的代码,希望对大家有帮助

    C++自己封装HTTP报头

    自己封装HTTP报头,发送服务器,接受返回信息!用于新手学习!

    delphi操作IdHTTP报头读写

    delphi操作IdHTTP报头读写 delphi操作IdHTTP报头读写

    HTTP解析器HTTPParser.zip

    C语言实现的HTTP解析器,提供请求和响应报文的解析功能,可用于高性能的HTTP应用程序中。它不使用任何系统调用及内存分配的功能,并且不缓冲任何数据,可以被随时中断使用。根据你的系统架构,它处理一个请求只消耗...

    python中使用urllib2伪造http报头的2个方法.docx

    python中使用urllib2伪造http报头的2个方法.docx

    whoami:Tiny Go Web服务器,可输出操作系统信息和HTTP请求以输出

    Tiny Go Web服务器,可输出操作系统信息和HTTP请求以输出 用法 路径 /data?size=n[&unit=u] :创建大小为n的响应。 如果指定了度量单位,则接受以下值: KB , MB , GB , TB (可选,默认值:字节)。 /echo :...

    J2EE Web程序开发定向班V1.0 Java就业班V2.0 (完整版)

    第06章:Servlet与JSP核心技术课程--6、http请求报头-http请求报头(1).rmvb 第06章:Servlet与JSP核心技术课程--6、http请求报头-http请求报头(2).rmvb 第07章:Servlet与JSP核心技术课程--7、http状态代码-http状态...

    移动IPv6(报头和工作流程)

    该ppt是关于移动IPv6的一个经典描述,包括其报头和基本的工作流程

    ip、tcp、udp_报头结构体分析.pdf

    ip、tcp、udp_报头结构体分析.pdf

Global site tag (gtag.js) - Google Analytics