Java Web应用请求参数编码

我们知道,当拼写要跳转的url中含有中文时,一般地需要转码处理,才能到服务器端正确的接收并处理,这是客户端与服务器端通讯时对数据格式的规约。

一般地,使用encodeURIComponent或者encodeURI来处理中文参数(这两者的区别,以及和escape的区别后面再说),编码后,在客户端,成为ISO-8859-1数据格式,一般表现在URL上为%XX这种形式的。

var url = "hello.do?person=" + encodeURIComponent("小明");
window.location.href = url;

“小明”经过encodeURIComponent后变成"%E5%B0%8F%E6%98%8E"。

>> encodeURIComponent("小明")
"%E5%B0%8F%E6%98%8E"
>> encodeURIComponent("中国")
"%E4%B8%AD%E5%9B%BD"
>> encodeURIComponent("abc/def")
"abc%2Fdef" >> encodeURIComponent("abc/def+-*/[email protected]#$%^&*(){}[]\|;‘:,./<>?\"") "abc%2Fdef%2B-*%2F345!%40%23%24%25%5E%26*()%7B%7D%5B%5D%7C%3B‘%3A%2C.%2F%3C%3E%3F%22" 

到服务器后,服务器端接收请求参数,然后进行相应处理。

不同的中间件,对于HTTP请求参数的处理不同,一般负责接收参数值,并传递给应用服务器(在应用程序请求参数值时)。

为了处理不同情形以及内部处理的方便,最开始接收与最终传递到应用服务器之间,中间件可能做了一些处理,比如编码成特定格式等。

在Java中,通常用getParameter获取客户端传递的参数(ajax与跳转的区别,以及与getAttribute的区别,getAttribute是服务器与服务器内部之间的数据传递),通常的形式为:

String person = request.getParameter("persion");

那么,这样获取,编码因素都考虑进去了么,实际上,如果没有指定使用中间件的HTTP请求编码格式,会采用相应中间件的默认HTTP请求编码格式。对GET方式和POST方式的请求,设置HTTP请求编码格式的方式是不一样的。

按我个人理解,中间件HTTP默认请求编码,指的是它默认以什么编码方式识别从客户端传递来的数据。

对于POST方式,一般地,在获取所有请求参数之前,调用request.setCharacterEncoding("ISO-8859-1")即可指定post内容编码格式,然后再根据后面需要,转换成需要的编码格式的串。

request.setCharacterEncoding("ISO-8859-1");
String person = request.getParameter("person");
person = new String(person.getBytes("ISO-8859-1"), "UTF-8");

对于GET方式,

tomcat默认接收HTTP请求参数编码格式就是ISO-8859-1,当然也可以在配置文件中修改成其他,位置为:server.xml文件中,相应的端口的Connector的属性:URIEncoding=UTF-8(一般不这样修改,如果本来就是需要接收为ISO-8859-1,在代码中统一处理编码)

<Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75" URIEncoding=UTF-8
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />

jetty默认接收HTTP请求参数编码格式是UTF8,一般在JVM启动参数中配置,形如:

 -Dorg.mortbay.util.URI.charset=iso8859-1

GET方式下实际请求参数,代码如下:

String person = request.getParameter("person");
person = new String(person.getBytes("ISO-8859-1"), "UTF-8");
时间: 2024-12-15 12:49:56

Java Web应用请求参数编码的相关文章

Java Web 修改请求参数

方法一.继承 HttpServletRequestWrapper , 实现自定义 request 1.除了修改的参数,其他 Header 等参数不变, 等同于修改了请求参数 2.实质是另一个请求 /** * @author zxguan * @description * @create 2018-03-02 9:51 */ public class ParameterRequestWrapper extends HttpServletRequestWrapper { private Map pa

java web中请求和响应中包含中文出现乱码解析

说明:在计算机中保存的一切文本信息是以一定的编码表(0,1,0,1)来保存我们所认识的字符(汉字或英文字符),由字符到计算机存储的二进制过程是编码,由读取二进制到文本的过程称为解码.而字符编码有多种不同的编码表,所以,如果编码格式和解码格式不是同一个码表就会出现乱码.想要避免出现乱码,需要使保存和读取时使用相同的码表. 在java web编程中经常会出现乱码,现在详细讲解一下如何进行设置,避免乱码 1 网页编码 在编写网页的时候,需要指定网页的编码格式,使用<meta http-equiv=&quo

Java Web 涉及到的编码

对于使用中文来说,有 I/O 的地方就会涉及到编码,前面已经提到了 I/O 操作会引起编码,而大部分 I/O 引起的乱码都是网络 I/O,因为现在几乎所有的应用程序都涉及到网络操作,而数据经过网络传输都是以字节为单位的,所以所有的数据都必须能够被序列化为字节.在 Java 中数据被序列化必须继承 Serializable 接口. 这里有一个问题,你是否认真考虑过一段文本它的实际大小应该怎么计算,我曾经碰到过一个问题:就是要想办法压缩 Cookie 大小,减少网络传输量,当时有选择不同的压缩算法,

Java Web之请求和响应

Servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,Web容器在调用service()之前都会创建两个对象,分别是HttpServletRequest和HttpServletResponse.其中HttpServletRequest封装HTTP请求消息,HttpServletResponse封装HTTP响应消息.需要注意的是,Web服务器运行过程中,每个Servlet都会只创建一个实例对象,不过每次请求都会调用Servlet实例的service(ServletRequest

java web get请求跨域(转)

http://hw1287789687.iteye.com/blog/2188617 java  web中如何跨域请求呢? 使用jsonp,详情请参考:http://json-p.org/ 页面代码如下: Html代码   <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <scri

js处理url中的请求参数(编码/解码)

在处理 a 链接跳转其他页面时,总会遇到需要传递一些当前页面的信息到其他页面,然后其他页面利用这些信息进行相关操作.利用 get 请求或 hash 传递是常见的方式. 首先,需要对传递的参数进行编码,保证数据的安全性:之后,将参数拼接到要跳转的url后,并设置为 a 链接中的 href 属性值. var util = { setUrlParam: function (params, targetUrl) { var url = ''; if(params && targetUrl){ //

从零写Java Web框架——请求的处理

大概思路 继承 HttpServlet,实现 DispatcherServlet,拦截所有请求: DispatchServlet 重写 init()方法,负责初始化框架: 重写 service()方法,获取 HttpServletRequest.HttpServletResponse: 通过 HttpServletRequest.HttpServletResponse,获取请求路径.请求参数,进行请求的处理,并做转发或重定向: 思维导图

Java Web中请求转发和请求包含

1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAttribute()取出数据 3.在AServlet转发到BServlet,那么整个请求都是由BServlet来完成,AServlet不再插手 4.AServlet 包含BServlet,那么两个Servlet共同完成请求 5.请求转发和请求包含都需要使用一个对象RequestDispatcher. A

Java web应用中的常见字符编码问题的解决方法

以下是 Java Web应用的常见编码问题 1. html页面的编码 在web应用中,通常浏览器会根据http header: Content-type的值来决定用什么encoding, 比如遇到Content-Type: text/html; charset=UTF-8, 页面使用的就UTF-8编码. 但是考虑到离线的html(用户可能把页面html保存到本地), 打开离线的html的时候就要在meta指定编码,当然不指定也会有default值,那么不指定有时就可能出现乱码. Meta标签 <