自己动手写Web容器之TomJetty之三:掀起请求盖头来

ISO15118-20协议测试实战:用Efficient XML库验证26条命令编解码(附完整代码) 本文分享了ISO15118-20协议测试实战经验,重点探讨了使用Efficient XML库对26条命令进行EXI编解码验证的过程。通过搭建测试环境、编写自动化程序并与官方工具链进行交叉比对,文章深入分析了4条命令编码结果不一致的原因,并提供了完整的排查思路与C代码示例,旨在帮助开发者确保电动汽车充电通信的协议一致性。 阅读详情

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229

       前面我们对于实现TomJetty做了一些知识铺垫和复习,息知了HTTP请求的头部的组成元素。目前的TomJetty服务器已经能够成功启动,可是请求一旦过来却又看不懂^_^。所以本文就来解析HTTP请求头,剖析它的各部分。让TomJetty服务器能够明白它的意图。

1HTTP请求头解析

(1)编写一个RequestHeader类,用户封装请求头对象。

package cn.lynn.tomjetty;

import java.util.HashMap;

/**
 * 封装请求头
 * @author lynnli1229
 */
public class RequestHeader {

    private String method;
    private String url;
    private String protocal;
    private String accept;
    private String accept_language;
    private String user_agent;
    private String accept_encoding;
    private String ip;
    private String port;
    private String connection;
    private String cookie;
    
    // 存放请求头键值对
    private HashMap<String, String> map;
    // 存放请求头文本
    private String txt;

    // 省略getter()和setter()方法

    @Override
    public String toString() {
        return "RequestHeader [" + "\n"
            + method + " " + url + " " + protocal + "\n"
            + "Accept: " + accept + "\n"
            + "Accept-Language: " + accept_language + "\n"
            + "User-Agent: " + user_agent + "\n"
            + "Accept-Encoding: " + accept_encoding + "\n"
            + "Host: " + ip + ":" + port + "\n"
            + "Connection: " + connection + "\n"
            + "Cookie: " + cookie + "\n"
            + "]";
    }
}

(2)设计一个IRequestHeaderParser接口,并声明parse()方法,用于解析请求头文本内容。

package cn.lynn.tomjetty;

public interface IReqestHeaderParser {

    public RequestHeader parse(String txt) throws Exception;

}

(3)提供IRequestHeaderParser接口的实现类RequestHeaderParserImpl,用于执行解析操作。注意一下,我们是以IE浏览器请求头为例,其他版本浏览器请求头的参数顺序会有变动,但整体差别不大。

package cn.lynn.tomjetty;

import java.util.HashMap;

public class RequestHeaderParserImpl implements IReqestHeaderParser {

    /**
     * 解析HTTP请求头
     */
    public RequestHeader parse(String txt) throws Exception {
        RequestHeader header = new RequestHeader();
        header.setTxt(txt);

        // 截取请求头第一行
        String firstLine = txt.substring(0, txt.indexOf("\n"));
        String method = firstLine.substring(0, firstLine.indexOf(" "));
        String url = firstLine.substring(firstLine.indexOf(" ") + 1, firstLine.lastIndexOf(" "));
        String protocal = firstLine.substring(firstLine.lastIndexOf(" ") + 1, firstLine.length());
        
        header.setMethod(method);// 获取Accept参数值,存放到RequestHeader对象当中
        header.setUrl(url);// 获取Accept参数值,存放到RequestHeader对象当中
        header.setProtocal(protocal);// 获取Accept参数值,存放到RequestHeader对象当中
        
        String[] lines = txt.split("\n");
        HashMap<String, String> map = new HashMap<String, String>();
        // 从请求头第二行开始分隔,因为第一行没有冒号
        for (int i = 1; i < lines.length; i++) {
            String[] result = lines[i].split(": ");
            map.put(result[0], (result.length <= 1) ? "" : result[1].replace('\n', ' ').trim());
        }
        header.setMap(map);
        header.setAccept(map.get("Accept")); // 获取Accept参数值,存放到RequestHeader对象当中
        header.setAccept_language(map.get("Accept-Language")); // 获取Accept-Language参数值,存放到RequestHeader对象当中
        header.setUser_agent(map.get("User-Agent")); // 获取User-Agent参数值,存放到RequestHeader对象当中
        header.setAccept_encoding(map.get("Accept-Encoding")); // 获取Accept-Encoding参数值,存放到RequestHeader对象当中
        header.setIp(map.get("Host").split(":")[0]); // 获取Host参数的IP参数值,存放到RequestHeader对象当中
        header.setPort(map.get("Host").split(":")[1]); // 获取Host参数的Port参数值,存放到RequestHeader对象当中
        header.setConnection(map.get("Connection")); // 获取Connection参数值,存放到RequestHeader对象当中
        header.setCookie(map.get("Cookie")); // 获取Cookie参数值,存放到RequestHeader对象当中

        return header;
    }

}

(4)在TomJetty类的run()方法中加入如下代码,用于将解析请求头的结果打印到控制台上。

try {
    InputStream in = socket.getInputStream(); // 获取客户端发送的字节流
    OutputStream out = socket.getOutputStream(); // 获取服务端响应的字节流
    byte[] b = new byte[1024 * 1024]; // 设置字节缓冲区
    in.read(b); // 读取客户端字节流(字节流的请求头)
    String txt = new String(b).trim(); // 将请求头封装成String,准备交给解析器解析
    IReqestHeaderParser parser = (IReqestHeaderParser) Class.forName(TomJettyUtil.getValue("tomjetty.requestheader.class"))
        .newInstance(); // 使用工厂设计模式从tomjetty.config中加载请求头解析器的实例
    RequestHeader header = parser.parse(txt); // 终于可以解析了
    System.out.println(header);
} catch (Exception e) {
    e.printStackTrace();
}

2解析效果展示


        在IE浏览器中输入上述地址后,控制台打印如下:

RequestHeader [
GET /hello.jsp HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/QVOD, application/QVOD, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; KB974488)
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:9527
Connection: Keep-Alive
Cookie: null
]

        写到这里,我们终于完成了对HTTP请求头的解析操作,感觉代码比预想的要多,其中字符串的拆分是关键,其他也就没什么了。OK!现在的TomJetty已经能够读懂请求的内容了,接下来就要着手为该请求提供服务了。可是服务的方式有很多种,其中响应静态页面请求就是很基本的一种。所以,在接下来的一节中我们将处理TomJetty服务器响应静态网页请求的问题。


Mixer-First Receiver适用于宽带阵列应用的接收机技术1 Mixer-First Receiver适用于宽带阵列应用的接收机技术1技术的背景单元级数字化阵列传统链路到Mixer-First链路的逻辑考虑三种场景小结 技术的背景 在文章《吊打全球的顶级毫米波数字阵列项目-MIDAS》中提到了DARPA在MIDAS项目中在毫米波实现宽带单元级数字化阵列用到了一个关键的叫做N-Path filter的技术,而这个技术同样出现在了《让微波射频工程师颤抖的芯片-MATRICs》的MATRICs芯片中。 为什么DARPA的各个合作研究机构选择这种技术?这篇来自Universi 阅读详情

相关推荐

【驭风计划 机器学习】实验6 基于集成学习的 Amazon 用户评论质量预测

¶随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的评论质量参差不齐,甚至有水军刷好评或者恶意差评的情况出现,严重影响了顾客的购物体验。因此,对于评论质量的预测成为电商平台越来越关注的话题,如果能自动对评论质量进行评估,就能根据预测结果避免展现低质量的评论。本案例中我们将基于集成学习的方法对 Amazon 现实场景中的评论质量进行预测。

Mege1的博客 471

嵌入式jetty相关知识总结

1嵌入式jetty简介 在介绍嵌入式jetty之前,首先介绍一下jetty。 Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和Web连接。

李昊的专栏 3866

解决VMware与Hyper-V/Device Guard冲突的实用指南

本文详细解析了VMware与Hyper-V/Device Guard冲突的根源,并提供了三种实用的解决方案:彻底关闭相关功能、通过启动配置实现选择性引导,以及使用VMware Workstation Pro的Hyper-V兼容模式。指南包含清晰的诊断步骤、操作命令和避坑建议,帮助用户根据自身需求灵活选择,实现虚拟化环境的稳定运行或高效共存。

weixin_29306317的博客 684

Jetty9源码剖析 - Connection组件 - HttpGenerator

转载自ph0ly:http://www.ph0ly.com 一、概念 HttpGenerator顾名思义就是HTTP协议报文生成器,用于HTTP响应报文的生成,和HttpParser相对应。相比于HttpParser复杂的状态机,HttpGenerator状态机设计更精简一点 二、流程图 Servlet(或Filter)通过向输出流中写数据(当然也可以不写),完成业务处理后,通过Htt...

qq_41084324的博客 381

华为AR3260路由器NAT回流配置实战:从WEB界面到命令行的完整避坑指南

本文详细解析了华为AR3260路由器NAT回流(Hairpin NAT)的配置原理与实战方法。针对内网用户无法通过公网地址访问内部服务器的常见问题,文章不仅剖析了WEB界面配置的常见报错原因,更提供了清晰、可靠且一劳永逸的命令行(CLI)配置方案与排错指南,帮助企业网络工程师彻底解决内外网访问不一致的难题。

u6v7w8x的博客 872

Frenet坐标系下动态街道场景的最优轨迹生成

本文详细解读了Lattice Planner

BigDavid123的博客 2390

深入Jetty源码之Servlet框架及实现(ServletRequest、ServletResponse)

概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象。这一层抽象隔离了HTTP服务器的实现细节,而Servlet规范定义了各个类的行为,从而保证了这些“服务器端运行的小程序”对服务器实现的无关性(即提升了其可移植性)...

weixin_34138255的博客 572

储能BMS三级架构解析:从模组到堆的管理与控制

本文深入解析了储能电池管理系统(BMS)的核心三级架构,即电池模组管理层(BMU)、电池簇管理层(BCMU)和电池堆管理层(BAMS)。文章详细阐述了各级的职能分工与协同机制,从底层数据采集、均衡管理,到中层信息汇总与安全控制,再到顶层的系统总控与对外通信,揭示了该架构如何实现大规模储能电池的精细化、安全与高效管理。

ik678901234的博客 471

自己动手写Web容器之TomJetty之五:包装请求参数

传送门☞轮子的专栏☞转载请注明☞http://blog.youkuaiyun.com/leverage_1229 前面我们实现了TomJetty响应无参请求静态页面的功能,但真实情况下,几乎所有请求都得携带参数。不能处理用户参数请求的Web服务器就好比温室里的花朵,始终上不了台面。所以本节我们将为TomJetty加入响应用户参数的功能。此外,前面我们使用的提交请求的方式都是G...

weixin_30432179的博客 151

PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录

揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。

weixin_42627902的博客 372

Android UI 组件系列(二):Button 进阶用法

在这篇博客中,我们深入探讨了 Button 的进阶用法,重点介绍了如何通过 事件处理 来响应用户的操作,如何使用 自定义样式 来提升按钮的外观,并利用 StateListDrawable 来管理按钮在不同状态下的表现。这些技巧能够帮助你打造更具交互性、视觉吸引力和动态响应的按钮,提升用户体验。

weixin_39339407的博客 1625

[置顶] 野生Web容器之TomJetty之掀起你的盖头来

传送门:上一节         上文我们对于实现这个野生Web容器做了一些知识铺垫和复习,息知了HTTP请求的头部的组成元素,本文我们主要讲解如何在代码中去解析它的各个部分,掀起盖头来,给哥笑一个^_^。在这之前,我们需要建立服务器,把框架搭建起来。 一、服务器建立 1.新建一个名为TomJetty的Java工程。 2.在工程src目录下新建一个tomjetty.config文件,用于提...

weixin_33798152的博客 168

基于STM32设计的遥控灭火消防小车_296

随着城市化进程的加速和火灾发生频率的增加,传统的消防方式在应对初期火灾时存在反应慢、效率低等问题。为了提高火灾响应速度和灭火效率,本设计开发了一款基于STM32单片机的遥控灭火消防小车。该小车配备了烟雾检测、温湿度监测、火源定位、灭火操作等功能,能够通过蓝牙和WIFI实现远程控制与实时视频传输。设计采用了MQ2烟雾传感器、SHT30温湿度传感器、火光传感器和ESP32摄像头模块等硬件设备。系统不仅能够自动检测和定位火源,还可以手动调整灭火器对准位置,进行干粉灭火。此外,蜂鸣器用于火源报警,确保操作人员及时得

722

[置顶] 自己动手写Web容器之TomJetty之六:动态页面引入

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 1.Web服务内功经脉 传送门 ☞ 2.让服务动起来 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面起步 传送门 ☞ 5.包装请求参数         在上一节,我们已经完成了TomJetty服务器处理静态页面请求的功能。但是只能处理...

weixin_34242331的博客 110

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[置顶] “非主流”Web容器之TomJetty之让服务动起来

传送门 ☞ 1.Web服务内功经脉 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面启程 上一节我们对于实现TomJetty服务器做了一些与Web有关的知识铺垫和回顾。那么从本节正式开始实现TomJetty服务器的“山寨”之旅。要想实现一个服务器,第一步要把服务器建立起来,并且能够正常运行,才能等待来自客户端的请求。考虑到这一点,我们本节就来处理TomJet...

weixin_30480583的博客 76

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jetty 对请求头的限制

当浏览器发起请求时 出现http code 413 问题 full head 一个的可能是URI过长导致的。这样即使是put还是post 都会出现这个问题。 另一种可能是确实head过长,且该长度是需要的。如果使用的是jetty,可以改大jetty 的请求head buffer size。 改动在jetty.xml 的 addConnector 下。 具体文档: [url]htt...

闪烁的星空 2470

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Jetty 怎么接收客户端post传过来的数据?(http)

public JSONObject getPostBodyData(HttpServletRequest request , String ....param){ request.setCharacterEncoding(UTF-8); reader = new BufferReader(new InputStreamReader(request.getInputStrea...

dagecao的博客 1463

常见的HTTP请求头、响应头、状态码。

常见的HTTP请求头 请求头 说明 Accept-Charset 用于指定客户端接受的字符集 Accept-Encoding 用于指定可接受的内容编码,如Accept-Encoding:gzip.deflate Accept-Language 用于指定一种自然语言,如Accept-Language:zh-cn Host 用于指定被请求资源的Inter...

孤芳不自赏 2313

深入Jetty源码之HttpParser

概述 Jetty作为HTTP服务器,服务器和客户端以HTTP协议格式通信,Jetty使用Parser(HttpParser)来抽象HTTP请求消息和响应消息的解析类引擎。在HttpParser实现中,它采用有限状态机算法:定义了21中状态,每解析一个字符,就根据当前的状态做相应的处理,并决定是否要迁移到下一个状态,直到HTTP请求消息或响应消息解析完成。...

weixin_33929309的博客 653

自己动手写Web容器之TomJetty之一:服务内功经脉

传送门☞轮子的专栏☞转载请注明☞http://blog.youkuaiyun.com/leverage_1229 Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-...

weixin_30394251的博客 95

带你五分钟搞定Jackson JSON Processor

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 1Jackson 是什么? (1)崇尚速度的(传说比其他Java json parser和data binder执行起来更快) (2)数据流动的(读取,写入) (3)完全独立的(独立于JDK之外的其他包) (4)火力十足的(为通用JDK类提供完整的数据绑定,就像Java be

leverli的专栏 7012

自己动手写Web容器之TomJetty之六:动态页面引入

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 传送门 ☞ 1.服

leverli的专栏 6430

Design and Model Analysis of the E-Commerce Development Platform for 3-Tiered Web Applications

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229 Abstract   Many Internet applications employ 3-tiersoftware architecture such as e-commerce system. Starting from analyze thearchitect

leverli的专栏 5106
上一篇: Android银弧刀之ProgressBar之最炫民族风
下一篇: 基于Jave EE和AJAX的办公自动化系统架构设计和基准性能分析
innovation
博客等级 码龄14年 251粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值