ios11 ios下架应用如何安装的应用怎么办

3554人阅读
javaweb(12)
之所以出现乱码,主要是由于编码和解码采用的方法不同。
因此保证编码解码格式一致是避免乱码发生的重要前提。
问题背景:JavaWeb技术下,Tomcat作为容器,发送请求的时候出现乱码问题。
下面以两种常见的请求方式为例讲解乱码问题的解决方法。
1.Post方式请求乱码。
&&& 自从Tomcat5.x以来,Get方式和Post方式提交的请求,tomcat会采用不同的方式来处理编码。
对于Post请求,Tomcat会使用request.setCharacterEncoding和response.setCharacterEncoding方法设置的编码格式进行处理。
如果未设置,则默认都采用iso-8859-1编码。因此如果在发送Post请求的时候出现乱码,常见的解决方法如下:
a)& request.setCharacterEncoding(&utf-8&);
b)& String name = new&String(request.getParameter(&name&).getBytes(&ISO-8859-1&),&&UTF-8&);
(当然response的编码也不要忘记设置成utf-8的)
【注】:上面提供的是两种不同的方法,并不是一种方法的两个步骤!!!
我们可以看出来第一种方式写法固定,非常很适合通过写成过滤器的方式进行编码的统一转换。
publicclass EncodingFilter extends HttpFilter {
publicvoid doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
Stringcharset = this.getInitParameter(&charset&);
if(charset == null ||charset.isEmpty()) {
charset =&UTF-8&;
request.setCharacterEncoding(charset);
response.setContentType(&text/charset=& + charset);
chain.doFilter(request, response);
2.Get方式请求乱码
&& 我们刚谈到Tomcat对Post请求的编码处理策略,并且从字里行间读出了Tomcat对Post和Get的编码策略有所不同,
那么Tomcat对Get请求的编码策略到底是如何不同的呢?答案就是Tomcat对于Get请求并不会考虑使用request.setCharacterEncoding方法设置的编码
言外之意就是我们无法通过request.setCharacterEncoding方式来改变编码,因为最终Tomcat会永远使用iso-8859-1进行编码(但是要注意一下,
respon还是可以通过调用response.setCharacterEncoding方式进行编码的设置的),既然是这样的话下面这个方法还是勉强可行的
步骤一:response.setCharacterEncoding(&UTF-8&)
步骤二:String&name&=&new&String(request.getParameter(&name&).getBytes(&ISO-8859-1&),&&UTF-8&);
通过这两步,可以看到我们的request的字符编码格式是默认的“iso-8859-1& 我们的response字符编码是自己设置的”utf-8&
显然两个是不相容的,因此我们在获取请求参数的时候才进行了一下字符集的转换即步骤二:
String&name=new&String(request.getParameter(&name&).getBytes(&ISO-8859-1&),&&UTF-8&);
&&&& 既然有a),那肯定还有b)咯?当然!而且方案b更加干净,利落,彻底。让我们一起看一下吧:
修改Tomcat安装目录下conf子目录下的server.xml文件(解决get方式)
【注:记得先停掉服务器】
找到文件中类似这样的段落:
&Connector connectionTimeout=&20000& port=&8080& protocol=&HTTP/1.1& redirectPort=&8443&/&
在里面加上这样一段:URIEncoding=&UTF-8& 即变成下面这段
&Connector connectionTimeout=&20000& port=&8080& protocol=&HTTP/1.1& redirectPort=&8443&
URIEncoding=&UTF-8&
最后重启Tomcat即可。
对于Get请求编码的统一处理也可以写成过滤器的形式,只不过稍微有些复杂。
EncodingRequest.java
public class EncodingRequest extends HttpServletRequestWrapper {
public EncodingRequest(HttpServletRequest request, String charset) {
super(request);
this.charset =
public String getParameter(String name) {
HttpServletRequest request = (HttpServletRequest) getRequest();
String method = request.getMethod();
if(method.equalsIgnoreCase(&post&)) {
request.setCharacterEncoding(charset);
} catch (UnsupportedEncodingException e) {}
} else if(method.equalsIgnoreCase(&get&)) {
String value = request.getParameter(name);
value = new String(name.getBytes(&ISO-8859-1&), charset);
} catch (UnsupportedEncodingException e) {
return request.getParameter(name);
EncodingFilter.java
public class EncodingFilter extends HttpFilter {
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
String charset = this.getInitParameter(&charset&);
if(charset == null || charset.isEmpty()) {
charset = &UTF-8&;
response.setCharacterEncoding(charset);
response.setContentType(&text/charset=& + charset);
EncodingRequest res = new EncodingRequest(request, charset);
chain.doFilter(res, response);
&filter-name&EncodingFilter&/filter-name&
&filter-class&cn.itcast.filter.EncodingFilter&/filter-class&
&init-param&
&param-name&charset&/param-name&
&param-value&UTF-8&/param-value&
&/init-param&
&filter-mapping&
&filter-name&EncodingFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
【注】为了避免您的测试与我给的解决方案结果不符,请在项目编码格式为utf-8,jsp页面&pageEncoding=&utf-8&的环境下测试。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:33978次
排名:千里之外
原创:24篇
评论:13条
(2)(5)(5)(4)(3)(1)(1)(3)引言& & GET请求的本质表现是将请求参数放在URL地址栏中,form表单的Method为GET的情况,参数会被浏览器默认编码,所以乱码处理方案是一样的。对于POST请求乱码,解决起来要比GET简单,我们关心的重点是在Request Body中。请求乱码——Method方式& &&使用Method方式发送HTTP请求时,根据HTTP协议的规定,查询参数应该在Request的Body中,例如在Chrome下可以看到URL中不含有查询参数。浏览器的编码& &&浏览器对POST的Request Body编码会采用页面指定的编码。这句话是我们听到最多也是众口相传的,但是到底什么是“页面指定的编码”?这个问题就涉及到我们的响应乱码问题了,用句废话就是页面显示时采用的编码,通过浏览器右键可以看到的。但是如果页面乱码了,那么页面使用的编码就是Content-Type里面指定的编码,如果Content-Type没有指定,那么就是meta标签中指定的charset,这两个编码即影响了浏览器对Page页面的解码,又影响了POST请求对Request Body的编码。详细可以查看meta标签的http-equiv和Content-Type资料。& &HTTP包传输的是字节码,不会传输字符,所以,不管是GET还是POST都需要编码。使用Chrome观察Request的Http包时,我们会发现POST的数据被放在Form Date下面,而GET的数据放在Query String Parameters页签下面。在页面没有乱码情况下,中文参数都会被默认解码。切换到View Source下面可以看到提交的编码参数。对于Request Body的长度,浏览器通过添加Content-Length报头来标记字节长度。服务器的解码& &&Web容器对POST方法的解码受request.setCharacterEncoding方法的影响。对于Tomcat容器,它的官方有这样的说明:How do I change how POST parameters areinterpreted?POST requests should specify the encoding ofthe parameters and values they send. Since many clients fail to set an explicitencoding, the default is used (ISO-8859-1). In many cases this is not thepreferred interpretation so one can employ a javax.servlet.Filter to setrequest encodings. Writing such a filter is trivial.翻译过来就是:& &对于POST请求,客户端应该明确的指明参数和值采用的编码类型,但是许多客户端并没有这么做,所以Tomcat会默认使用ISO-8859-1来解码POST的参数和值。许多时候,我们可以使用一个Filter来设定Request的编码,写这么个Filter是微不足道的一件小事。&& &简单说就是Tomcat默认使用ISO-8859-1来解码POST的参数和值,可以使用Filter来设定Request Body的字符集。方法就是调用request的setCharsetEncoding。& &文档中并没有说明客户端应该如何明确说明POST请求的编码类型,但是我想可能是通过Http协议的标准报头:Accept-Charset来指定的吧。我们没必要去做这个实验,因为我们的程序绝对不应该把这件事完全托管给“不靠谱”的客户端。& &所以大多数情况下,我们会在getParameter方法前调用request的setCharacterEncoding方法。就像Tomcat文档中说的,用一个自己写的或者官方提供的Filter完成这项工作就好了,Spring MVC提供的Filter也是简单的调用了这个方法:Spring MVC 字符编码过滤器源码:&@Override
protected void doFilterInternal(
HttpServletRequestrequest,HttpServletResponse response,FilterChain filterChain)
throws ServletException,IOException {
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding()== null)){
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding) {
response.setCharacterEncoding(this.encoding);
filterChain.doFilter(request, response);
}出现乱码:& &POST方法出现乱码时,首先确定下我们的页面使用的是哪种编码方案,然后调用request的setCharsetEncoding,一定要在getParameter前调用这个方法。& &如果仍然是乱码通过这样一个小实验就能知道哪里出错了。& &(1)先获取我们的乱码,String param = req.getParameter(&xx&);& &(2)对param = new String(param.getBytes(“服务器编码”,“页面编码”));& &(3)服务器编码、页面编码要有“合理”的猜测,页面编码通过浏览器菜单观察,别相信自己写的HTML标签。服务器编码可以试验ISO-8859-1和自己set的charset encoding,然后看看哪里和自己设计的不一致,问题自然就清楚了。总结:& &POST方式的乱码比GET处理要简单,我们不用关心URL的编码,也不用编码解码URL。POST乱码,一般调用setCharsetEncoding就可以解决了。但是要注意的是,POST的数据一样是经过编码、解码的!!只不过是不用手动进行而已。
最新教程周点击榜
微信扫一扫JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器
一、乱码原因
①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。
②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)
二、解决办法
方法一 每次传输都手动设置编码(GET方式传输数据)
String name = URLEncoder.encode("张三","UTF-8");
String path = "http://localhost:8008/xyWeb/xyServlet?name=" +
String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
若传输方默认采用UTF-8编码就没有必要每次写,但接收方每次都写太烦,可考虑过滤器。
方法二(过滤器)
* 编码过滤器
* @author xy
public class EncodingFilter implements Filter
public void init(FilterConfig fConfig) throws ServletException
encoding = fConfig.getInitParameter("encoding");
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception
HttpServletRequest httprequest = (HttpServletRequest)
if ("GET".equals(httprequest.getMethod()))
// 将httpRequest进行包装
EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding);
chain.doFilter(wrapper, response);
request.setCharacterEncoding(encoding);
response.setContentType("text/charset=" + encoding);
chain.doFilter(request, response);
public void destroy()
* httpRequest进行包装类
* @author xy
public class EncodingHttpServletRequest extends HttpServletRequestWrapper
private HttpServletR
public EncodingHttpServletRequest(HttpServletRequest request)
super(request);
this.request =
public EncodingHttpServletRequest(HttpServletRequest request,String encoding)
super(request);
this.request =
this.encoding =
public String getParameter(String name)
String value = request.getParameter(name);
if (null != value)
// tomcat默认以ISO8859-1处理GET传来的参数。把tomcat上的值用ISO8859-1获取字节流,再转换成UTF-8字符串
value = new String(value.getBytes("ISO8859-1"), encoding);
catch (UnsupportedEncodingException e)
e.printStackTrace();
&display-name&EncodingFilter&/display-name&
&filter-name&EncodingFilter&/filter-name&
&filter-class&cn.xy.filter.EncodingFilter&/filter-class&
&init-param&
&description&&/description&
&param-name&encoding&/param-name&
&param-value&UTF-8&/param-value&
&/init-param&
&filter-mapping&
&filter-name&EncodingFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&> 博客详情
摘要: get/post请求乱码
出现的问题:
通过get请求向服务器发送请求时,如果请求参数为中文时,服务器端接受到的参数为乱码。
乱码原因分析及解决办法:
1.关于解码和编码
编码:'中'→1110001
解码:1110001→'中'
乱码:编码和解码过程中使用了不同的字符集
2.Web应用中字符编码解码的问题
& & (1)请求过程:
&&&&& & &1&GET请求
&&&&&&&&& & 浏览器端是以UTF-8进行编码,所以在服务器端也应该以UTF-8进行解码
&&&&&&&&& & 由于GET请求参数附着在URL地址后面,所以要统一的URL地址的解码字符集。
&&&&& & 解决办法:
&&&&&&&&& & 在tomcat配置文件server.xml中找到第一个connector加入如下属性 URIEncoding=UTF-8
&&&&& & &2&POST请求
&&&&&&&&& & 在获取请求参数前执行:request.setCharacterEncoding("UTF-8");
& & (2)响应过程
&&&&& & (1)指定响应数据的编码字符集
&&&&& & (2)告诉浏览器响应数据应该使用什么字符集进行解码
&&&&&&&&& & &1&Tomcat服务器会自动根据“解码字符集”设置“编码字符集”
&&&&&&&&& & &2&设置编码字符集:告诉浏览器当前响应数据的内容类型:response.setContentType("text/charset=UTF-8");需要注意的是,需要在response.getWriter();之前设置,否则无效。
所有的过滤器都只对POST请求起作用,在jsp页面中设置字符编码方式,都只是对表单提交时的POST请求起作用,对GET请求不能起到设置其字符编码的作用,
在GET请求中使用的是默认的编码方式,所以对GET请求,需要在server.xml文件中设置URIEncoding="UTF-8"然后重启TOMCAT便可以实现解决中文乱码问题,
但是不建议在href超链接请求中传达中文参数,也不建议在GET请求中传递中文参数。
另外对传递的部分中文实现传递和接收时的统一的编码方法在传达参数时使用"reply.jsp?title="+java.net.URLEncoder.encode(keywords)
然后在接收参数页面使用keywords=new String(request.getParameter("keywords").getBytes("8859_1"));这种方式虽然暂时解决了中文乱码问题,
但是在后期的维护和部署到其他的服务器时可以仍会会出现中文乱码了问题,所以不建议使用。
对于Post请求,只需在Servlet或者jsp中写入如下代码就可以把解决从表单中传入的中文乱码问题
&request.setCharacterEncoding("utf-8");
而对于Get请求,因为请求参数会被附加到地址栏的URL之后,所以不能用上面的处理方法。应该这样:
&&&String str=request.getQueryString();
&&&//使用URLDecoder解码字符串
&&&String str1=java.net.URLDecoder.decode(str,"utf-8");
&&&String[] paraStrings=str1.split("&");
&&&&//paraStrings[0]就是第一个参数,依次类推...
&&&for(String paraString : paraStrings)
&&&&&&&&&String[] nameValue=paraString.split("=");
&&&&&&&&&//nameValue[0]就是表单的name,nameValue[1]就是表单name对应的值
还有一种方法就是获取请求参数之后对请求参数值重新编码,也就是先将其转换成字节数组,再将字节数组重新解码成字符串。
&&String str=request.getParameter("name");
&&byte[] bytes=str.getBytes("ISO-8859-1");
&&String name=new String(bytes,"utf-8");
结论:传递中文参数时,最好使用POST请求来提交。不同服务器设置编码方式可能不同,不同操作系统设置编码方式也可能不同。
人打赏支持
参与源创会
领取时间:
“”在线下联结了各位 OSCer,推广开源项目和理念,很荣幸有你的参与~
领取条件:参与过开源中国“源创会”的 OSCer 可以领取
码字总数 40353
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥Get,Post请求中文乱码问题有效解决方法 - Leoxlu - 博客园
随笔 - 104, 文章 - 0, 评论 - 0, 引用 - 0
对于做Java WEB项目同学来说,中文乱码问题是一个经常遇到而又非常头痛的问题,而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程,至于出现乱码的原因不是本文的关注的重点,想了解的朋友可以参考
本文主要介绍如何有效解决web请求中的乱码问题,其实解决方法有很多种,不同的请求类型解决方法也不相同。
本文只介绍最方便的一种:
1、针对Post方式提交的请求如果出现乱码,可以每次在request解析数据时设置编码格式:
request.setCharacterEncoding("utf-8");
也可以使用编码过滤器来解决,最常用的方法是使用提供的编码过滤器:
在Web.xml中增加如下配置(要注意的是它的位置一定要是第一个执行的过滤器):
&filter&&filter-name&charsetFilter&/filter-name&&filter-class&org.springframework.web.filter.CharacterEncodingFilter&/filter-class&&init-param&&param-name&encoding&/param-name&&param-value&UTF-8&/param-value&&/init-param&&init-param&&param-name&forceEncoding&/param-name&&param-value&true&/param-value&&/init-param&&/filter&
该过滤器要做的其实就是强制为所有请求和响应设置编码格式:
request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");
2、针对Get方式的乱码问题,由于参数是通过URL传递的,所以上面通过request设置的编码格式是不起作用的,此时可以在每次发生请求之前对URL进行编码:例如:Location.href="/encodeURI"("http://localhost/test/s?name=中文&sex=女");
当然也有更简便的方法,那就是在服务器端配置URL编码格式:
修改tomcat的配置文件server.xml:&&&&&&&&&&&&&&Connector&URIEncoding="UTF-8"&&&&&&&&&&&&&&&&& port="8080"&& maxHttpHeaderSize="8192"&&&&&&&&&&&&&& maxThreads="150" minSpareThreads="25" maxSpareThreads="75"&&&&&&&&&&&&&& connectionTimeout="20000" disableUploadTimeout="true" /&
只需增加&URIEncoding="UTF-8" &这一句,然后重启tomcat即可。
相信通过这两段配置,你再也不用担心遇到乱码啦,当然还有可能出现乱码,那将是另一篇文章的事啦!

我要回帖

更多关于 ios 备份 已下架应用 的文章

 

随机推荐