TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
5 T! q$ s+ b; ~: h; z
8 w7 k: {* b& l/ s% Y/ N! Z; Z
0 W) B9 Y' y9 ]$ R# a5 P今天上午 做验证码的功能、碰巧是中文验证码、明明输入对了结果一直提示验证码错误、后台打印下 结果是乱码、检查了一下web.xml 也是配置了字符过滤器。
0 Z) V% C, ? M" ]0 ^. v: [" q5 j
% X; c5 D% l& r- }- i8 l4 r1 f
由于其他地方 也是用了ajax 但是提交中文时没有问题的、对比一下结果发现 type 类型不一样、前者是post请求后者是get请求(乱码)。
. G) \3 G4 b/ u/ F/ u9 k
/ n- \4 O8 U- H( C9 l
" }, B7 _& J2 j' i) P百度了一下 get 和post请求的区别:
- [8 i: `# l" M, a/ ~ {# p对于Post请求,只需在Servlet或者jsp中写入如下代码就可以把解决从表单中传入的中文乱码问题
+ G$ J& U6 M, b N( j request.setCharacterEncoding("utf-8"); J% X; a/ ]1 \7 x$ y( o' p
而对于Get请求,因为请求参数会被附加到地址栏的URL之后,所以不能用上面的处理方法。应该这样:
- `. S( a/ `7 `5 N5 b( J5 u9 P$ D String str=request.getQueryString();* W: ^2 {! |/ n+ R
//使用URLDecoder解码字符串# G( Z0 z: S* R1 U6 M
String str1=java.net.URLDecoder.decode(str,"utf-8");
$ ~5 u. M: A, b String[] paraStrings=str1.split("&");
4 ]/ C9 |/ m4 z) @- I* t //paraStrings[0]就是第一个参数,依次类推...
4 w, {& i: z1 q# R6 c% i) C$ ? for(String paraString : paraStrings)- Z2 {/ b' O# ^& i
{" B9 ^+ A- Q! B8 K( J
String[] nameValue=paraString.split("=");, q1 j: f( n1 z7 [, A9 ?
//nameValue[0]就是表单的name,nameValue[1]就是表单name对应的值. o6 I/ H0 {9 d- R8 X9 P6 j$ T
}
/ F, S& c b5 r" l8 O还有一种方法就是获取请求参数之后对请求参数值重新编码,也就是先将其转换成字节数组,再将字节数组重新解码成字符串。
( Z0 u+ n! I- J9 M; G& V/ b String str=request.getParameter("name");
5 c# a/ g1 v y H9 D: l. A byte[] bytes=str.getBytes("ISO-8859-1");' h: p+ d! |2 |) T4 e
String name=new String(bytes,"utf-8");" w& P" b7 R9 c' B: J
3 _9 L4 R m) m! ~ j
所以get即使走过滤器 解码方式也是不一样的 所以导致乱码 改为post请求就ok了。
4 }4 d* Q# y; M/ Y& B# k" \4 ^' ~, l
|
|