①enctype="multipart/form-data" 上传文件使用的表头,内容input等以二进制传递,可以一定程度上避免表单提交中文乱码(针对的是前后端编码一致的情况)。
②
Struts2的上述标签,可以设置编码格式,针对的是post请求。
相当与request.setCharacterEncoding("GBK");
③关于请求方式。Get请求和post请求的区别及说明。
1. Get请求为url请求方式,携带的参数会在url后边以?Name=张三&age=18这种形式存在。如果包含中文,由于浏览器无法传递中文,需要先进行编码,这时候经历了浏览器编码----》服务器中间件解码的过程。因为没有指定请求头的编码格式,服务器中间件默认是用iso-8859-1编码进行解码的,此时后端可通过 new String(aa.getbytes(“iso-8859-1”),’”gbk”)等方式重新组合编码获取正确的编码格式。
对于单独的url加参数的请求方式(非表单提交),我们可以将中文参数进两次encodeURI,第一次编码得到的是UTF-8形式的URL,第二次编码得到的依然是UTF-8形式的URL,但是在效果上相当于首先进行了一 次UTF-8编码(此时已经全部转换为ASCII字符),再进行了一次iso-8859-1编码,因为对英文字符来说UTF-8编码和ISO- 8859-1编码的效果相同。后端在用常规接收接收的时候web中间价会自动进行一次解码,即用ISO- 8859-1进行了解码,然后我们在用URLDecoder.decode(aa,’”gbk”)即可解码为正确的中文。
对于tomcat来说,我们可以在server.xml的<Connector port 中添加URIEncoding="gbk" 标签来进行设置tomcat的默认解码格式(紧针对get方式有效),weblogic也有相似的配置。 tomcat还有一个标签:useBodyEncodingForURI="true",添加的位置和上边相同,但是并不意味着这两个标签可以同时使用。useBodyEncodingForURI="true"标签告诉tomcat解码的时候用请求体指定的编码(即post请求编码)格式进行get请求的解码,此时适用post请求解决中文乱码问题。
2. 对于post请求来说,最常用的即:
request.setCharacterEncoding("gbk"),
response.setCharacterEncoding("gbk"),
只针对post请求方式有效。
的方式进行指定post请求的编解码解决中文乱码。需要注意的问题是:此设置只对于此次请求没有进行任何request.getparmer()操作的请求才有效,response同理要在返回之前设置。因此我们常用spring的encodingFilter拦截器进行编码格式的设置,跟踪源码会发现其本质就是request.setCharacterEncoding("gbk"),但是拦截器能保证一定设置在request.getparmer()之前,而且不用我们每个方法都啰嗦的写上边的东西。
编解码问题还涉及到请求头contentype以及jsp页面的pageEncoding等等,此处不再详细说明。