java web 编码小记

一个url结构

用户提交一个URL,在这个URL中可能存在中文,因此需要编码,如何对这个URL进行编码?先看一下

java 中 httpServletRequest.getRequestURL() 和 httpServletRequest.getRequestURI()返回的结果:

Http :/ /localhost :8080 /examples/ servlets/ servlet/ 君山? auth=君山

url:  Http :/ /localhost :8080 /examples/ servlets/ servlet/ 君山

uri/examples/ servlets/ servlet/ 君山

scheme :          Http
domain :         localhost
port:                8080
contextPath:   examples
servletPath:    servlets/servlet
pathInfo:         君山
queryString:   auth=君山

post 对应在Tomcat的<Connector port="8080">中的配置,而 contextPath

在<Context path="/examples"> 中的配置

URI编码问题

有可能 pathInfo 和 queryString 的编码不一样的,不同浏览器对pathInfo的编码也可能不一样。

对URL的URI部分进行解码的字符集是在<Connector URIEncoding="UTF-8">中定义的,如果没有定义,那么默认编码ISO-88591 解析。

queryString编解码问题

get 与post方式的http请求表单参数都是作为Parameters保存的,都通过request.getParameter获取参数。对它们的解码是在request.getParameter方法第一次被调用时进行的。对get和post方式传递的参数进行解码,但它们的解码字符集有可能不一样。queryString 的解码字符集要么是Header中ContentType定义的Charst,要么默认的ISO-88591,要使用ContextType 中定义的编码,就要将connextor的
<Connextor URIEncoding="UTF-8" useBodyEncodingForURI="true"> 中的useBodyEncodingForURI设置为true。这个配置不是对整个URI采用BodyEing进行解码,而仅仅是对queryString 使用BodyEncoding解码。

post编解码

前面提到了POST表单提交的参数的解码是在第一次调用request.getParameter时发生的,POST表单的参数传递与QueryString不同,它是通过HTTP的BODY传递至服务端的,当我们在页面上单击提交按钮时浏览器首先将根据ContentType的Charset编码格式对在表单中填入的参数进行编码,然后提交至服务端,在服务端两样也是用ContentType中的字符集进行解码。

注意,在第一次调用request.getParamter方法之前就设置request.setCharacterEncoding(charset),否则你的POST表单提交上来的数据也可能出现乱码。

  • tomcat对request参数的解码流程

1.先根据Header中content-type的charset值(默认情况下,浏览器提交的form表单没有charset信息)
2.根据request.setCharacterEncoding(charset),的值来解码
3.如果都没有,表单提交的数据将会按照系统的默认编码方式解析

  • 浏览器对response数据的解码流程

1.response的内容可以通过服务端的response.setCharacterEncoding来设置,它将会覆盖request.getCharacterEncoding的值,并且通过Header的Content-type返回客户端,

2.浏览器接收到返回的Socket流时将通过Content-type的charset来解码

3.如果Heaer没有指定编码,那么浏览器将根据html中
<meta HTTP-equiv="Content-Type" content="text/html; charset=GBK">中的charset来解码

4.如果也没有定义,那么使用默认的编码来解码。

 

js脚本的编码问题

引入js文件时的编码:

<script src="...xx.js" charset="gbk"></script>

如果script中没有charset,浏览器就会以当前这个页面的字符集解析这个js文件

 js异步调用的url编码                                                                                       

处理js中url的编码有两个函数:

1.encodeURI()  编码, 通过 decodeURI() 解码

2.  encodeURIComponent()  编码, decodeURIComponent()解码

encodeURIComponent 编码的更彻底,一般用在将一个URL当作一个参数放在别一个URL中

 

                                                                                                   --- 摘自《深入分析java web 技术内幕》

转载于:https://my.oschina.net/u/2552286/blog/1609558

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.javaJava类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值