TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
+ Y" F8 T& |% @
2 @. J: T; H. u/ \) Y* `: f5 `. t/ z2 x- n; y
今天上午 做验证码的功能、碰巧是中文验证码、明明输入对了结果一直提示验证码错误、后台打印下 结果是乱码、检查了一下web.xml 也是配置了字符过滤器。
8 H" P @2 v5 f5 A+ Z5 h8 h. {
; C8 g" i+ ~9 T2 h" s" P: Z8 T* G, J0 X
由于其他地方 也是用了ajax 但是提交中文时没有问题的、对比一下结果发现 type 类型不一样、前者是post请求后者是get请求(乱码)。
T. D: K8 k* t5 ~% S! f. J x* o( i/ f% T: K" U
( ?0 s% a P; p0 k+ m
百度了一下 get 和post请求的区别:
. g b: T) ?0 S# y. b对于Post请求,只需在Servlet或者jsp中写入如下代码就可以把解决从表单中传入的中文乱码问题* G7 w2 ]: G( z( \3 I
request.setCharacterEncoding("utf-8");
2 u4 s% y& f4 \而对于Get请求,因为请求参数会被附加到地址栏的URL之后,所以不能用上面的处理方法。应该这样:( x8 x5 J' l N' B4 i) F z
String str=request.getQueryString();
2 I |/ R) g# Q2 s //使用URLDecoder解码字符串4 K. I& w7 U+ p! O+ F; o% r* j
String str1=java.net.URLDecoder.decode(str,"utf-8");# ?( m- { Y4 Z# L" p
String[] paraStrings=str1.split("&");& C8 P: s; \& X j$ s
//paraStrings[0]就是第一个参数,依次类推...
& s6 g8 R- o$ n9 ~9 i for(String paraString : paraStrings): m6 E8 f1 A- B3 O# G
{
4 M: `, k7 e' _4 Y& x String[] nameValue=paraString.split("=");
5 B) e. O9 l5 X" c" C //nameValue[0]就是表单的name,nameValue[1]就是表单name对应的值- C0 s! Y+ p- X* d# t2 x
}
: v$ a# R7 H/ B" E7 [' _还有一种方法就是获取请求参数之后对请求参数值重新编码,也就是先将其转换成字节数组,再将字节数组重新解码成字符串。
* K' e4 n9 H4 `; t. } String str=request.getParameter("name");/ e. Q( M. V b2 z6 {) ]
byte[] bytes=str.getBytes("ISO-8859-1");1 L$ D" k$ R. P4 x. q: t- C X
String name=new String(bytes,"utf-8");
% _1 V- F6 K4 {& y3 b7 \2 ~
2 Z2 [$ S: K* r* Q% i所以get即使走过滤器 解码方式也是不一样的 所以导致乱码 改为post请求就ok了。& h$ j$ K4 O! Z2 N) Q9 N
, p& J# A8 ^4 y' Q |
|