JSP页面之间传递中文参数的解决方法
本文转载自:
关于JSP页面之间传值的中文乱码总结
用过滤器来解决JSP中文乱码问题
URLEncoder.encode与URLDecoder.docode传递中文参数编码与解码
URLEncoder与URLDecoder的使用
-------------------------------------------------------------------------------------------------------
本部分转载自:关于JSP页面之间传值的中文乱码总结
------------------------------------------------------------------------------------------------------------
本部分转载自:用过滤器来解决JSP中文乱码问题
1 package com.util;2 3 import java.io.IOException;4 import java.io.UnsupportedEncodingException;5 6 import javax.servlet.Filter;7 import javax.servlet.FilterChain;8 import javax.servlet.FilterConfig;9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletRequestWrapper;
14 import javax.servlet.http.HttpServletResponse;
15 import javax.servlet.http.HttpSession;
16
17
18 //过滤器处理表单传到servlet的乱码问题
19 public class MyFilter implements Filter{
20 //自写一个request换掉原来的request,重写里面的getParemeter方法,可以设置编码
21 class MyRequest extends HttpServletRequestWrapper{
22
23 @Override
24 public String getParameter(String param) {
25 String value = null;
26 try {
27 //post
28 super.setCharacterEncoding(encoding);//把编码转换为encoding
29 value = super.getParameter(param);
30 if(super.getMethod().equalsIgnoreCase("GET")){
31 if(value!=null){
32 value = new String(value.getBytes("iso8859-1"),encoding);
33 }
34 }
35 } catch (UnsupportedEncodingException e) {
36 // TODO Auto-generated catch block
37 e.printStackTrace();
38 }
39 return value;
40 }
41
42 public MyRequest(HttpServletRequest request) {
43 super(request);
44 }
45
46 }
47 protected String encoding=null;
48 public void destroy() { //销毁
49 // TODO Auto-generated method stub
50 this.encoding=null;
51 }
52 //对编码问题进行转换
53 public void doFilter(ServletRequest request, ServletResponse response,
54 FilterChain chain) throws IOException, ServletException {
55 // TODO Auto-generated method stub
56 response.setContentType("text/html;charset="+encoding);
57 //过滤未登录用户
58 HttpServletRequest req = (HttpServletRequest) request;
59 HttpServletResponse resp = (HttpServletResponse) response;
60 String path=req.getServletPath();
61 String param=req.getQueryString();
62 if(path!=null){
63 path=path+"?"+param;//全请求路径
64 }
65 if(path.endsWith("myAddress")||path.endsWith("myJingDong")||path.indexOf("myShouCang")!=-1||path.endsWith("updateUser")||path.indexOf("showOrder")!=-1||path.indexOf("showValidOrder")!=-1||path.indexOf("showCancelOrder")!=-1||path.indexOf("fillOrder")!=-1){
66 HttpSession session = req.getSession();
67 String userName = (String) session.getAttribute("username");
68 if(userName == null){
69 session.setAttribute("url", path.replaceFirst("/", ""));
70 System.out.println(session.getAttribute("url"));
71 resp.sendRedirect("user.do?op=loginAction");
72 return;
73 }
74 }
75 //把过滤器给下一个过滤器或资源处理器
76 chain.doFilter(new MyRequest((HttpServletRequest) request), response);
77 }
78
79 public void init(FilterConfig filterConfig) throws ServletException {
80 // TODO Auto-generated method stub
81 this.encoding=filterConfig.getInitParameter("encoding");//encoding在web.xml中指定
82 }
83
84 }
然后在web.xml对该过滤器进行注册和映射:
<filter><filter-name>EncodingFilter</filter-name><filter-class>com.util.MyFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping></span>
上面写的过滤器MyFilter类,本来只能处理post提交的数据(post是先处理后接收,get是先接收后处理)。
但是MyFilter里面在对任何页面过滤的时候,来了一个偷梁换柱:把原来客户端请求的request给换掉了,换成自己定义的一个request了,即内部类MyRequest,不过该类要继承一个类HttpServletRequestWrapper。
在自定义的一个内部类MyRequest里面,实现了一个好强大的功能,就是重写了request的getParameter()方法。该方法里面即处理了post提交,又能处理get提交,返回的值就是处理后的值,所以该过滤器就能实现处理post和get提交的乱码问题!
--------------------------------------------------------------------------------------------------
本部分转载自:URLEncoder.encode与URLDecoder.docode传递中文参数编码与解码
在传递参数的时候,如果有中文,那么可以先转码再转,之后再解码。
--------------------------------------------------------------------------------------------------------------
本部分转载自:URLEncoder与URLDecoder的使用
今天传url的时候乱码了。先说情形,url中有searchText=中文的情形,后台new String(searchText.getBytes(ISO-8859-1),"gbk")来获取,jsp中的是GBK的编码,服务器用的是jboss,里面有个server.xml有如下配置。
<Connector port="80" address="${jboss.bind.address}"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIENCODING="UTF-8"/>
之前是没有uriencoding这个属性的,我给干掉,问题解决,这时候用的是默认值即ISO-8859-1。
关于server.xml的配置可以参考这个url的文档
http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch02.html
问题解决的过程中,我特意研究了一下urlencode和urldecode这两个类,之所以没有用这种方案是因为我获得页面上的连接的时候用的是一个开源的叫做Cloud的类。
网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会: 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码; 2.将空格转换为加号 (+) ; 3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值; 4.在每个 name=value 对之间放置 & 符号。
编码过程非常简单,任何字符只要不是ASCII码数字,字母,或者前面提到的标点符,它们都将被转换成字节形式,每个字节都写成这种形式:一个“%”后面跟着两位16进制的数值。空格是一个特殊情况,因为它们太平常了。它除了被编码成“%20”以外,还能编码为一个“+”。加号(+)本身被编码为%2B。当/ # = & 和?作为名字的一部分来使用时,而不是作为URL部分之间的分隔符来使用时,它们都应该被编码。
类URL并不自动执行编码或解码工作。你能生成一个URL对象,它可以包括非法的ASCII和非ASCII字符和/或%xx。当用方法getPath() 和toExternalForm( ) 作为输出方法时,这种字符和转移符不会自动编码或解码。你应对被用来生成一个URL对象的字符串对象负责,确保所有字符都会被恰当地编码。
URLencode这个类负责把String编码成平台上的通用形式,urldecode类可以把url转换成string格式。
下面是urlencode的demo:
public static void main(String[] args) {try {System.out.println(URLEncoder.encode("This string has spaces","UTF-8"));System.out.println(URLEncoder.encode("This*string*has*asterisks","UTF-8"));System.out.println(URLEncoder.encode("This%string%has%percent%signs", "UTF-8"));System.out.println(URLEncoder.encode("This+string+has+pluses","UTF-8"));System.out.println(URLEncoder.encode("This/string/has/slashes","UTF-8"));System.out.println(URLEncoder.encode("This\"string\"has\"quote\"marks", "UTF-8"));System.out.println(URLEncoder.encode("This:string:has:colons","UTF-8"));System.out.println(URLEncoder.encode("This~string~has~tildes","UTF-8"));System.out.println(URLEncoder.encode("This(string)has(parentheses)", "UTF-8"));System.out.println(URLEncoder.encode("This.string.has.periods","UTF-8"));System.out.println(URLEncoder.encode("This=string=has=equals=signs", "UTF-8"));System.out.println(URLEncoder.encode("This&string&has&ersands","UTF-8"));System.out.println(URLEncoder.encode("Thiséstringéhasé non-ASCII characters","UTF-8"));System.out.println(URLEncoder.encode("this中华人民共和国","UTF-8"));} catch (UnsupportedEncodingException ex) {throw new RuntimeException("Broken VM does not support UTF-8");}}
执行结果如下:
This+string+has+spaces
This*string*has*asterisks
This%25string%25has%25percent%25signs
This%2Bstring%2Bhas%2Bpluses
This%2Fstring%2Fhas%2Fslashes
This%22string%22has%22quote%22marks
This%3Astring%3Ahas%3Acolons
This%7Estring%7Ehas%7Etildes
This%28string%29has%28parentheses%29
This.string.has.periods
This%3Dstring%3Dhas%3Dequals%3Dsigns
This%26string%26has%26ersands
This%C3%A9string%C3%A9has%C3%A9+non-ASCII+characters
this%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD
很明显url中有/%&=这类字符也会被编码,对于我们来说是不对的。例如
public static void main(String[] args) {try {System.out.println(URLEncoder.encode("pg=q&kl=XX&stype=stext&q=+\"Java+I/O\"&search.x=38&search.y=3","UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}
这个结果就是不对的了,会有如下输出:
pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3
所以这种情形我们要对每一部分做分段encode
pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3
对于urldecoder类来说
它们解码以x-www-form-url-encoded这种形式编码的string。也就是说,它们把所有的加号(+)转换成空格符,把所有的%xx分别转换成与之相对应的字符
直接上demo:
public static void main(String[] args) {String input = "http://www.altavista.com/cgi-bin/" + "query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3"; String output;try {output = URLDecoder.decode(input, "UTF-8");System.out.println(output); } catch (UnsupportedEncodingException e) {e.printStackTrace();} }
输入的结果如下:
http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=+"Java I/O"&search.x=38&search.y=3
更多的可以参考这个文章:
http://www.java3z.com/cwbwebhome/article/article2/2414.html
总结一下,今天发生的中文乱码的问题最终的解决方案可能和urlencode和urldecode没有多大关系,这里有时间还要熟悉一下jboss的server.xml的配置文件。urlencode主要有encode方法,用来把url中非数字和字母的字符转换成%加两位16进制。urldecode主要有decode方法,用来把一个含有%加两位16进制的url转换成正常的编码。
JSP页面之间传递中文参数的解决方法相关推荐
- jsp页面之间传中文参数显示乱码问题的解决
jsp页面之间传中文参数显示乱码问题的解决 参考文章: (1)jsp页面之间传中文参数显示乱码问题的解决 (2)https://www.cnblogs.com/sllzhj/p/9673628.htm ...
- HTML的Get方法URL传递中文参数,解决乱码问题
HTML的Get方法URL传递中文参数,解决乱码问题 参考文章: (1)HTML的Get方法URL传递中文参数,解决乱码问题 (2)https://www.cnblogs.com/chenyucong ...
- JSP中文及传中文参数乱码解决方法小结
在使用JSP的过程中,最使人头疼的一个问题就是中文乱码问题,以下是我在软件开发中遇到的乱码问题以及解决方法. 1.JSP页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在 ...
- Linux下Tomcat死活找不到JSP页面中import指定类的解决方法
如果你没有使用任何的IDE,只是用自己喜欢的文本编辑器写代码,并手动部署到webapps/下的话,经常会遇到 "类 cannot be reloved to a type" 的错误 ...
- Web报表页面如何传递中文参数
http://blog.csdn.net/yuanziok/article/details/47747111
- 页面间传输中文的乱码解决方法
今天测试昨天完成的页面,参数中用了中文,发现结果不对,有乱码.打开Web.config,发现.NET在Web.config中的默认编码格式为utf-8,于是在传输中文的时候变成了乱码,相应的接收也是乱 ...
- spring mvc中关于url中传递中文乱码的解决方法
在传值过程中,也是乱码出现的频繁地.先不说到底是什么场景了,通常常用的方案有如下几个 配置指定的filter <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--><f ...
- ASP.NET页面之间传递值的几种方式
页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有QueryString,Session,Cookie ...
- mysql limit 动态参数_MySQL中limit使用动态参数的解决方法(拼接SQL字符串语句来执行SQL)...
官方好像说过limit已经在5.6版本上支持了动态参数,但是测试时依然还是不行. 那么要解决limit动态参数唯一能做的就是使用字符串SQL拼接的形式,然后再进行执行. 一般有以下方式解决: 1.存储 ...
最新文章
- springMvc的执行流程(源码分析)
- linux启动phpstudy,phpstudy启动不了解决方法
- mysql5.1 mysiam,将MySQL 5.1 MyISAM 转换成 INNODB 存储引擎
- SAP HR 报表开发
- Swoole实现私聊群聊
- TCP/IP的七层模型
- python!!!!惊了,这世上居然还有这么神奇的东西存在
- mysql获取最好成绩对应数据的其他项_开源数据同步神器——canal
- Pentium II Pentium III架构/微架构/流水线 (1) - 架构概述
- cesium 文本标注被遮挡_Cesium-知识点(Viewer)
- 【读书笔记】《梁宁·产品思维三十讲》——产品经理人生规划修心课
- MATLAB数字水印系统
- Java8 map转list集合
- Windows10 LTSB/LTSC 企业版安装应用商店
- HbuilderX导入项目运行到微信小程序代码杂乱问题
- 图的最小生成树(Prim算法、Kruskal算法)
- 高新技术企业认定指导
- oracle 19c INS-20802
- 写作小课堂:【写好简历】强调效果胜过强调水平、保持一致性和向上的趋势、在简历中要用好主题词。通常不超过两页(A4纸正反两面)为佳
- 如何使用HMCL启动器配置Java版Minecraft
热门文章
- 报错:Allocation of ******* exceeds 10% of free system memory.
- 魔都要用最先进的神经网络预测交通?前排围观
- 谷歌浏览器插件Automa_0.自我见解及官方文档
- 从五星酒店到大众浴室——死多头的困境
- 修复GRUB:win10 1709 秋季创意者更新导致Linux双系统无法引导
- 浙大计算机系帅哥,浙江大学有位帅哥!立志成为一名卓越的医学统计学家
- 君润人力,用技术提升整体人资效益
- BlackBerry,黑莓的开发工具,官方网站下载地址
- 黑莓android系统,黑莓Passport运行Android系统
- JAVA计算机毕业设计腾讯网游辅助小助手源码+系统+mysql数据库+lw文档