TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
+ ?# L3 l; G) q: v2 V
- L2 t: _2 @! f) c, b! g- Z
/ W; R: k5 A, e2 ~ J0 w5 _
今天上午 做验证码的功能、碰巧是中文验证码、明明输入对了结果一直提示验证码错误、后台打印下 结果是乱码、检查了一下web.xml 也是配置了字符过滤器。
, e! y ?: d2 a- o
, Z) J4 u0 W8 x& f! l
5 }6 G- `, n, h5 W& y由于其他地方 也是用了ajax 但是提交中文时没有问题的、对比一下结果发现 type 类型不一样、前者是post请求后者是get请求(乱码)。
# o) y* N& T8 f% H u% o( X$ {- x- j2 C i( k2 ^ t
: W/ @& p! j$ D4 h% g" _
百度了一下 get 和post请求的区别:: R, A/ U- j/ [' N/ s! ]
对于Post请求,只需在Servlet或者jsp中写入如下代码就可以把解决从表单中传入的中文乱码问题5 j' P% R- m2 s4 [+ }- d# I7 ?& U( G
request.setCharacterEncoding("utf-8");
& S- w& X. x" G) h' l: ?4 Y% \而对于Get请求,因为请求参数会被附加到地址栏的URL之后,所以不能用上面的处理方法。应该这样:
# c: @4 z( f4 a$ u% ~8 H2 P2 Q String str=request.getQueryString();1 K( C/ y7 F8 T/ V
//使用URLDecoder解码字符串
5 \# U. e' Q& b# z% e, Q" W! }4 @ String str1=java.net.URLDecoder.decode(str,"utf-8");7 B7 F' M( e% @; m4 K" f4 C
String[] paraStrings=str1.split("&");
& S6 |9 X+ a/ [6 \5 F7 Y2 [ //paraStrings[0]就是第一个参数,依次类推...8 E8 `8 B% R3 u* k/ }
for(String paraString : paraStrings)7 @0 C; j6 \* k$ \) i9 g4 f3 r% q
{
8 A% b8 B0 H( x0 D& v$ Q) {1 _ String[] nameValue=paraString.split("=");
9 A4 k+ H9 a" w+ z! G //nameValue[0]就是表单的name,nameValue[1]就是表单name对应的值
& @ n$ [+ z9 J; T& }) e}! J( j% q4 i3 ]. z) H
还有一种方法就是获取请求参数之后对请求参数值重新编码,也就是先将其转换成字节数组,再将字节数组重新解码成字符串。: w- ~" d" l' U6 f' ?( k7 `
String str=request.getParameter("name");4 o8 R' F. r S# e
byte[] bytes=str.getBytes("ISO-8859-1");* p2 b5 G* v+ B$ S9 N
String name=new String(bytes,"utf-8");1 B) x( S) ?! C X) J; d6 o
8 w0 n0 V0 Q! T1 c' l# R
所以get即使走过滤器 解码方式也是不一样的 所以导致乱码 改为post请求就ok了。# |1 ?- G4 h8 F
9 D/ @8 r! B6 @1 c$ i3 O
|
|