TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
! a& d; l: |: v; y; b! W! v2 M
5 d4 W5 x+ v5 k, X9 v2 O; `# p
9 @7 `6 I7 X- @3 P
今天上午 做验证码的功能、碰巧是中文验证码、明明输入对了结果一直提示验证码错误、后台打印下 结果是乱码、检查了一下web.xml 也是配置了字符过滤器。
" x b. _. t8 I& v( q! I7 l7 ~
$ f6 ~ X7 U. s' k( C, O- j1 W& }) K9 `8 l- w" l' B
由于其他地方 也是用了ajax 但是提交中文时没有问题的、对比一下结果发现 type 类型不一样、前者是post请求后者是get请求(乱码)。/ Y8 `. Q: {1 u5 W
5 f4 l T3 H, y; u/ }
* y+ H5 I7 ?' @4 a; `4 Z6 M0 I百度了一下 get 和post请求的区别:& Q- q `* n% V
对于Post请求,只需在Servlet或者jsp中写入如下代码就可以把解决从表单中传入的中文乱码问题3 _9 a' s' T* b# a# g
request.setCharacterEncoding("utf-8");
+ C2 i. U' T" k, C9 Q而对于Get请求,因为请求参数会被附加到地址栏的URL之后,所以不能用上面的处理方法。应该这样:
) {% l" r& H" b+ k) C6 n6 t String str=request.getQueryString();
: a$ j1 F' f, z* ~8 Z$ s //使用URLDecoder解码字符串
7 ^8 ~7 E1 A- H String str1=java.net.URLDecoder.decode(str,"utf-8");* m5 T0 c7 Y0 ` p4 e
String[] paraStrings=str1.split("&");
1 q! E) S6 p" e' B //paraStrings[0]就是第一个参数,依次类推...3 Z) _7 V2 Z4 ]; A; k5 s! A( M( a, B
for(String paraString : paraStrings)
6 E/ p& u* K0 @" D{1 T- |' g O4 `) b5 e
String[] nameValue=paraString.split("=");
2 N( v1 N& E* s; }9 s' ` //nameValue[0]就是表单的name,nameValue[1]就是表单name对应的值) M: o2 A) |& t/ p F. o
}0 J0 D7 U& D3 E/ D3 Q
还有一种方法就是获取请求参数之后对请求参数值重新编码,也就是先将其转换成字节数组,再将字节数组重新解码成字符串。+ | G! y2 p5 _/ `+ v8 k
String str=request.getParameter("name");$ J4 r. a, i0 H& k o
byte[] bytes=str.getBytes("ISO-8859-1");% Z5 H) i* ~' q$ V0 x1 m7 o
String name=new String(bytes,"utf-8");( @2 I1 Y( [: T0 u
% k/ x7 X& Y# A; c所以get即使走过滤器 解码方式也是不一样的 所以导致乱码 改为post请求就ok了。# D* [! h! y0 b0 W
- N9 G( i( M: N- Q+ R |
|