TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
9 Z: m: y+ `' q9 U
$ R7 x4 ^% }% e' U
S4 B6 W- h" i: W( w6 y今天上午 做验证码的功能、碰巧是中文验证码、明明输入对了结果一直提示验证码错误、后台打印下 结果是乱码、检查了一下web.xml 也是配置了字符过滤器。7 ?" k$ Q8 `. x
, q4 z8 c z' U6 ]- A6 m6 w) y S1 N& e* u$ w8 S
由于其他地方 也是用了ajax 但是提交中文时没有问题的、对比一下结果发现 type 类型不一样、前者是post请求后者是get请求(乱码)。: i0 ], i9 \0 |) g g- q+ o. ^
c; Z- a: p$ x1 d; P1 q/ |0 R1 w1 v6 X X" j4 g/ f# n" g
百度了一下 get 和post请求的区别:
/ i3 S L2 x, d! K对于Post请求,只需在Servlet或者jsp中写入如下代码就可以把解决从表单中传入的中文乱码问题
* c' C/ q9 P/ g8 j. T3 R- t" L request.setCharacterEncoding("utf-8");) k" i* f; @! ]7 P. L6 {) u
而对于Get请求,因为请求参数会被附加到地址栏的URL之后,所以不能用上面的处理方法。应该这样:1 k& k8 Y2 T' ~9 g5 q4 E% @
String str=request.getQueryString();
I$ T+ h: T; v, k8 ~% d. [4 ~ //使用URLDecoder解码字符串
4 v, G! h# P0 y+ P( ?0 l String str1=java.net.URLDecoder.decode(str,"utf-8");
5 H) I, q4 B; J, K String[] paraStrings=str1.split("&");; A! D* u3 v. T9 r) g0 F' r
//paraStrings[0]就是第一个参数,依次类推...
) E t4 V0 L# a& N& e) ?" Y/ V% F' E for(String paraString : paraStrings)) Y$ ]0 o0 n1 f- r; B' E, i
{- r$ }9 M% d9 k9 D3 E
String[] nameValue=paraString.split("=");
0 T% H/ O- ?. W' L6 {1 p //nameValue[0]就是表单的name,nameValue[1]就是表单name对应的值( @, T6 B5 @: C8 u9 K; D2 B
}
' F7 y1 `2 }) L$ e% z/ A还有一种方法就是获取请求参数之后对请求参数值重新编码,也就是先将其转换成字节数组,再将字节数组重新解码成字符串。
+ ]6 l; F ]5 c8 i) S3 g1 h& W/ @ String str=request.getParameter("name");3 l2 p4 v$ b% y o$ Z# K# ^1 ]) F
byte[] bytes=str.getBytes("ISO-8859-1");3 ^4 |! m) o4 P( E \' b
String name=new String(bytes,"utf-8");
2 J4 c; b% H( _( [6 ?) G# [7 v7 G% m3 J" D
所以get即使走过滤器 解码方式也是不一样的 所以导致乱码 改为post请求就ok了。
' _1 i% L: i2 }5 s+ `: n+ u! y
1 \- H6 g0 w( l3 R6 S |
|