客户端对对服务器返回的请求头是如何解码的 - 爱问答

(爱问答)

客户端对对服务器返回的请求头是如何解码的

1. 什么是URL编码。URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value,将他们以name/value编码方式作为URL的一部分或者分离的发送到服务器上。2. URL编码规则。每对name/value由&分开,每对来自表单的name/value用=分开。如果用户没有输入值的那个name依旧会出现不过就是没有值。URL编码是在字符ASCII码的十六进制数的前面加上%。例如(她的十六进制数表示为5c)的URL编码就是%5c。3. 简单介绍乱码和http请求其实做web开发乱码问题是经常出现的,有了上面编码的基础之后下面来看看乱码。1) 乱码问题是web开发过程中经常遇到的问题,主要原因就是URL中使用了非ASCII码造成服务器后台程序解析出现乱码的问题。2) URL中最容易出现中文的地方就是在QueryString的参数值还有Servletpath中。3) 简单用一个图来说明一下http请求的流程:第一步:浏览器把URL经过编码送给服务器;第二步:服务器把这些请求解码处理完毕之后将显示的内容进行编码发送给客户端浏览器;第三步:浏览器按照指定的编码显示网页4) 详细剖析GET提交如何编码以及服务器如何解码以及乱码解决方案对于GET方式,我们知道它的提交是将请求数据附加到URL后面作为参数,这样依赖乱码就会很容易出现,因为数据name和value很有可能就是传递的为非ASCII码。当URL拼接后,浏览器对其进行encode,然后发送到服务器。具体规则见URL编码规则。这里详细说一下encode的过程中容易出现的问题,在这个过程中我们要明白需要URL encode的字符一般都是非ASCII码字符,所以我们就能知道出现乱码主要是URL中附加了中文或特殊字符做成的,另一个要知道URL encode到底是以什么样的编码方式对字符进行编码的,其实这个编码方式是由浏览器决定的,不同的浏览器和同一浏览器的不同设置影响了URL的编码,所以为了避免我们不需要的编码,我们可以通过java代码或javaspcript代码统一进行控制。完成了URL encode之后URL就成了ASCII范围内的字符了,然后就以iso-8859-1的编码方式转换为二进制随着请求头一起发送出去。到了服务器之后,首先服务器会先用iso-8859-1进行解码,服务器获取的数据都是ASCII范围内的请求头字符,其中请求URL里面带有参数数据,如果是中卫或特殊字符,那么encode后的%XY(编码规则中的十六进制数)通过request.setCharacterEncoding()是不管用的。这时候我们就能发现出现乱码的根本原因就是客户端一般是通过用UTF-8或GBK等对数据进行encode的,到了服务器却用iso-8859-1方式decoder显然不行。这里的解决方式有两种,一种:是通过String类的getBytes方法进行编码转换,具体java代码是:new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)第二种:在服务器xml代码中改配置信息:<Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"redirectPort="8443"URIEncoding="客户端编码"/>5) 详细剖析POST提交如何编码以及服务器如何解码以及乱码解决方案对于POST方式,表单中的参数值对是通过request包发送给服务器,此时浏览器会根据网页的ContentType("text/html; charset=GBK")中指定的编码进行对表单中的数据进行编码,然后发给服务器。在服务器端的程序中我们可以通过Request.setCharacterEncoding()设置编码,然后通过request.getParameter获得正确的数据。这里出现乱码可以通过Request.setCharacterEncoding()直接解决。

这个不好说的,要专业人没求助。

朋友您说的俺不懂但俺只能说此路不通另寻他路条条大路通北京吗。

http协议由两部分组成:请求和响应。当你在浏览器中输入一个URL时,浏览器将按照你的请求创建并且发送请求,该请求包含的所输入的URL以及一些与浏览器相关的信息。当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定URL(如果有的话)数据。知道浏览器解析该响应并显示出网页(或其他资源)为止。

HTTP请求

http请求的格式如下所示: 
<request-line> 
<headers> 
<blank line> 
[<request-body>]

request line

在http请求中,第一行必须是一个请求行(request line),用来说明请求类型、URL以及使用的HTTP协议的版本。

列表项

紧接着是一个首部(headers)小结说明服务器要使用的附加信息。

空行

主体(body)

添加其他任意数据的主体

在GTTP中,定义了很多请求类型,通常我们关心的只有GET、POST请求。只要在Web浏览器上输入一个URL浏览器就将基于该URL向服务器发送一个GET请求,告诉服务器获取并且返回什么资源。对于www.baidu.com的GET请求如下: 
GET/ HTTP/1.1 
Host: www.baidu.com 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) 
Gecko/20050225 firefox/1.0.1 
Connection: Keep-Alive

请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠(/),用来说明请求是该域名的根目录。最后一部分说明使用的是1.1版本的HTTP协议。

第二行是请求的第一个首部HOST。首部HOST将指出请求的目的地。结合上一行的(/),可以通知服务器访问的是www.baidu.com/.

第三行包含的是首部User—Agent,服务器端和客户端脚本都能访问它,是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义,并且在每个请求中都会自动发送。

最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(需要研究)(当然也有其他值)。注意,在最后一行首部之后有一个空行。即不存在请求主体,这个空行也是必须的。 
要发送GET请求的参数,则要将这些额外的信息附在URL本身的后面。 
EX:URL?name1=value1&name2=value2 
该信息陈志伟查询字符串(query String),它将会复制在HTTP请求的请求行中,如下所示: 
GET/books/?name=Professional%20ajax http/1.1 
Host: www.baidu.com 
User-Agent: 浏览器信息 
Gecko/20050225 firefox/1.0.1 
Connection: Keep-Alive

注意,为了将文本“Professional ajax”作为URL的参数,需要编码处理其内容,将空格替换为%20,这称为URL编码(URL Encoding),常用于Http的许多地方(JS提供了内建的函数来处理URL编码和解码)。“名称-值”(name-value)用&隔开。绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式。当然,如何使用这些数据还是由服务器决定的。

另外一方面,POST请求在请求主体中为服务器提供了一些附加的信息。通常,当填写一个在线的表单并提交它的时候,这些填入的数据将以POST请求的方式发送给服务器。 
EX: 
POST/ http/1.1 
host: www.baidu.com 
User-Agent: 浏览器及系统信息 
Content-Type: application/x-www-form-urlencoded(需要研究) 
Content-Length: 40 
Connection: Keep-Alive 
name=Professional%20Ajax&publisher=Wiley

从上面可以发现,Post和Get请求之间有一些区别。 
- 首先 
请求行开始处的Get和post。 
- 其次 
有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/x-www-form-urlencoded格式编码来传送数据,这是针对简单的URL编码的MIME(了解)类型。 
Content-Length说明了请求主体的字节数。 
Connection后是一个空行,再后面就是请求主体。与大多数浏览器的Post请求一样,这好似以简单的“名称-值”对的形式给出的,其中name是Professional Ajax,publisher是Wiley。你可以用同样的格式来组织URL的查询字符串参数。

常见的请求头: 
Accept:浏览器可接受的MIME类型。 
Accept-Charset:浏览器可接受的字符集 
Accetp-Encoding:浏览器能够进行编码的数据编码方式,比如gzip。许多况下gzip的页面可以检索5到10倍的下载时间。 
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言本事要用到 
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中 
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP1.1(HTTP1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著的减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Contetn-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。 
Content-Length:表示请求消息正文的长度。 
CookieL:这是最重要的请求头信息之一。 
From:请求发送者的email地址,由一些特殊Web客户程序使用,浏览器不会用到。 
Host:初始URl中的主机和端口 
If-Modified-Since:只有当所请求的被人在指定的日期之后又经过修改时才返回它,够则返回304“Not Modifede”应答。 
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了本页的本地拷贝。 
Referer:包含一个URL,用户从该URL代表的页面发出访问当前页面的请求。 
User_agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关。 
UA-Pixels,UA-Color,UA_OS,UA-CPU:由某些版本的IE浏览器所发送的非标准请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

HTTP响应

如下所示,Http响应的格式与请求的格式十分类似: 
<status-line> 
<herders> 
<blank line> 
[<response-body>] 
如你所见,在响应中为i亿真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求资源的况。 
EX: 
HTTP/1.1 200 OK 
Date: Sat, 31 Dec 2005 23:59:59 GMT 
Content-Type: text/html;charset=ISO-8859-1 
Content-Length:122 
<html> 
<head> 
<title></title> 
</head> 
<body> 
</html>

在本例中,状态行给出的HTTP状态代码是200,以及消息OK。状态行始终包含的是状态码和相应的简短消息,以避免混乱。最常用的状态码有: 
◆200 (OK): 找到了该资源,并且一切正常。 
◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。 
◆401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。 
◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。 
◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。

在状态行之后是一些首部。 
通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。 
接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length。在本例中,首部Content-Type指定了MIME类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)。响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。

注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据

 

是商业机密

这是核心机密

这个是GET方式的请求,完成,之后就会把提交的数据显示在报头 这是浏览器自带的 如果是POST请求方式在报头就只有请求方式+URI+你的HTTP协议版本

需要不同的接口规范

这是商业机密,外人无从知晓。

一般来说,解码都有固定的解码器有加密密钥匙和解密钥匙。望采纳。

下一篇:Seagate.Dashboard.Uploader.exe计算机丢失mfc100u.怎么开机后去掉

上一篇:plc三人抢答器梯形图

热门标签:
excel 网盘 破解 word dll
最新更新:
微软重新评估新的Outlook的使用时机 联想推出搭载联发科Helio G80芯片组的Tab M9平板 英特尔创新大赛时间确定! 微软Edge浏览器在稳定渠道中推出Workspaces功能 英伟达RTX4060TiGPU推出MaxSun动漫主题! 谷歌地图为用户提供了街景服务! GameSir 在T4 Kaleid中推出了一款出色的控制器! 微软开始在Windows 11 中测试其画图应用程序的新深色模式! LG电子推出全球首款无线OLED电视 英伟达人工智能芯片崭露头角! Steam Deck可以玩什么游戏-Steam Deck价格限时优惠 雷蛇推出CobraPro鼠标 Kindle电子阅读器可以访问谷歌商店吗 Windows10如何加入组策略 window10图片查看器怎么没有了?