用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~~~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值