web 应用请求乱码问题
背景
作为非西欧语系的国家,总是要处理编码问题
使用java编码解码
@Test
public void coderTest() throws UnsupportedEncodingException {
String str = URLEncoder.encode("中国人民", "GBK");
System.out.println(str); str = URLDecoder.decode(str, "UTF-8");
System.out.println(str); str = URLEncoder.encode(str, "ISO-8859-1");
System.out.println(str); str = URLDecoder.decode(str, "BIG5");
System.out.println(str); }
浏览器端
html页面可以设置字符集,比如:Content-Type:text/html;charset=UTF-8。
设置后的作用:
1、Get/Post方法提交参数会使用这个设置。
2、网页文字展示也会使用这个设置,比如把它修改为ISO-8859-1,网页中的非ASCII字符都会显示乱码。
服务器端
通过request.setCharacterEncoding()可以设置解析参数时使用的字符集(response也有这个方法)。
默认设置
容器和大部分浏览器默认编码处理都使用的是ISO-8859-1。
乱码原因
浏览器和服务器双方使用不同的编码设置,就会产生乱码。
解决方案
方案一、设置http服务器解析URL的编码方式
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<form method="get" action="world">
名称:<input type="text" name="name"><br>
<button>发出 GET 请求</button>
</form><br><br>
<form method="post" action="world">
名称:<input type="text" name="name"><br>
<button>发出 POST 请求</button>
</form>
</body>
</html>
Html Code
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/hello</path>
<port>8090</port>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Pom Code
package com.test; import org.junit.Test; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder; @WebServlet("/world")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
System.out.println("name: " + name); // name: 中国人民
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
System.out.println("name: " + name); // name: ä¸å½äººæ°
}
}
Java Code
关键配置是: <uriEncoding>UTF-8</uriEncoding>
这种方式只对get请求有效。因为它设置的只是http服务器解析url时要使用UTF-8。url解析是http服务器解析的,Tomcat里自带一个http服务器。
方案二、通过String的getBytes()指定编码来取得该字符串的字节数组,然后再重新构造为正确编码的字符串。
例如,若浏览器使用UTF-8处理字符,Web容器默认使用ISO-8859-1编码,则正确处理编码的方式为:
String name = request.getParameter(name);
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
这种方法对get/post请求都有效
方案三、使用HttpServletRequest的setCharacterEncoding()方法指定解析请求参数时使用的编码。
例如,若浏览器以UTF-8来发送请求,则接收时也要使用UTF-8编码字符串,则可以在取得任何请求值之“前”,执行语句:
request.setCharacterEncoding("UTF-8");
只适用于post请求;究其原因,是因为处理URL的是HTTP服务器,而非Web容器,如果使用get方法,HTTP服务器已经提前一步使用ISO-8859-1解析了url上的参数了,已经乱码了,所以再设置也没有作用了。
web 应用请求乱码问题的更多相关文章
- Java Web乱码分析及解决方式(一)——GET请求乱码
引言: 在进行Web開始时.乱码是我们最常常遇到也是最主要的问题.有经验的程序员非常easy能解决,刚開始学习的人则easy被泥潭困住. 并且非常多时候.我们即使攻克了乱码问题也是不明就里.往 ...
- web请求乱码问题总结
问题1:springmvc通过@ResponseBody向页面返回值(包括汉字)时,乱码 解决方案: springmvc3.2之后可以声明注解驱动器(不知道是不是这么翻译)的时候的控制编码的转换,结果 ...
- Java Web乱码分析及解决方式(二)——POST请求乱码
引言 GET请求的本质表现是将请求參数放在URL地址栏中.form表单的Method为GET的情况.參数会被浏览器默认编码,所以乱码处理方案是一样的. 对于POST请求乱码.解决起来要比GET简单.我 ...
- 1.JAVA WEB 笔记中文乱码
JAVA WEB 乱码问题解析 乱码原因 在Java Web开发过程中,经常遇到乱码的问题,造成乱码的原因,概括起来就是对字符编码和解码的方式不匹配. 既然乱码的原因是字符编码与解码的方式不匹配,那么 ...
- SpringMVC(一)--基础、REST、@RequestParam、POST请求乱码等
1.SpringMVC基本概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 ...
- form表单post请求乱码问题
今天做一个查询的小模块遇到了 请求乱码的问题,表单请求方式是post 解决方法是在web.xml 文件中配置一下内容 <!--配置解决post乱码问题filter --> <filt ...
- Get请求,Post请求乱码问题解决方案
下面以两种常见的请求方式为例讲解乱码问题的解决方法. 1.Post方式请求乱码. 自从Tomcat5.x以来,Get方式和Post方式提交的请求,tomcat会采用不同的方式来处理编码. 对于Post ...
- 如何解决WEB应用中文乱码问题
最容易出现乱码的场景是浏览器向服务器发送请求的过程,解决的策略就是强制为请求和响应设置编码格式. 一.POST 方式请求乱码 1. 在每个 Controller 中单独处理 request.setCh ...
- POST请求转换为PUT或者Delete请求、处理post请求乱码的过滤器、Get请求乱码
在web.xml中配置 <!--配置HiddenHttpMethodFilter : 将所有的POST请求转换为PUT或者Delete请求 --><filter> <fi ...
随机推荐
- (转)教你手工mysql拆库
原文:http://www.cnblogs.com/cchust/p/3859967.html 互联网网站应用大多采用mysql作为DB存储,限于mysql单机性能的瓶颈,为了支撑更大容量和更大的访问 ...
- Java之IO(九)其它字节流
转载请注明源出处:http://www.cnblogs.com/lighten/p/7063161.html 1.前言 之前的章节已经介绍了java的io包中所有成对(输入.输出对应)的字节流,本章介 ...
- Android Layout 01_activity_Login.xml
activity_login.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...
- Android 开发工具类 25_getJSON
获取 JSON 数据并解析 import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; im ...
- Android硬件抽象层(HAL)深入剖析(三)【转】
前面分析了android HAL层是如何搜索硬件模块的动态共享库的,其实就是在"system/lib/hw/"或者"/vendor/lib/hw/"这两个路径下 ...
- tf.data
以往的TensorFLow模型数据的导入方法可以分为两个主要方法,一种是使用feed_dict另外一种是使用TensorFlow中的Queues.前者使用起来比较灵活,可以利用Python处理各种输入 ...
- 常见的接口与类 -- Comparable
目录 1. 接口概述 2. 接口方法详读 3. 接口方法的实践操作 3.1 String和Integer对于compareTo()的实现 正文 接口Comparable 我们在字符串中见到过Comp ...
- C语言中的条件编译
通常情况,我们想让程序选择性地执行,多会使用分支语句,比如if-else 或者switch-case 等.但有些时候,可能在程序的运行过程中,某个分支根本不会执行. 比如我们要写一个跨平台项目,要求项 ...
- 设置input标签placeholder字体颜色
有时会遇到这样的需求,输入框的默认提示文字与用户输入的文字不同. <input className="city" placeholder="城市"/> ...
- tomcat shutdown.sh结束不了,Could not contact localhost:8005
使用./shutdown.sh关闭Tomcat,有时会关闭成功,有时会出现关闭错误; Jul 06, 2017 10:57:37 AM org.apache.catalina.startup.Cata ...