get请求参数中文,后台获取到参数一直是乱码问题


请求地址:  /diary/search?title=%E7%A4%BE%E4%BC%9A


后台处理代码:

String title=getPara("title");

System.out.println("搜索关键词:"+title);

Page<Diary> page=ds.search(1, 10, user.getId(), title);

System.out.println("搜索结果:"+page.getList().toString());


控制台输出:


搜索关键词:&#31038;&#20250;

搜索结果:[]


JFinal-4.9.03 action report -------- 2020-12-22 11:19:37 --------------------------

Url         : GET /diary/search

Controller  : controller.Diary_c.(Diary_c.java:1)

Method      : search

Interceptor : com.jfinal.ext.interceptor.SessionInViewInterceptor.(SessionInViewInterceptor.java:1)

              com.jfinal.plugin.activerecord.tx.TxByMethods.(TxByMethods.java:1)

              interceptor.GlobalInterceptor.(GlobalInterceptor.java:1)

Parameter   : title=社会  

--------------------------------------------------------------------------------


自己百度各种办法:

try {

title=URLDecoder.decode((new String(title.getBytes("ISO8859-1"), "UTF-8")), "UTF-8");

System.out.println("搜索关键词:"+title);

}catch(Exception e) {

e.printStackTrace();

}


等等,结果还是显示上面控制台效果。

有大佬知道是怎么回事吗?


评论区

JFinal

2020-12-22 11:45

控制台输出的是下面这样的:
Parameter : title=社会

证明服务端没有乱码,没问题的

在 url 中携带中文参数会被自动 encoding,在 tomcat 下需要配置一下 server.xml

如果使用 jfinal undertow 无需配置,自动支持

steven_lhcb_9527

2020-12-22 13:52

tomcat的默认编码是ISO-8859-1,在config/server.xml设置URIEncoding="UTF-8” useBodyEncodingForURI=“true” 这样请求体和urI都是utf8格式的了。不管是get和post都不会乱码了

yuwen01

2020-12-22 14:26

@JFinal Starting JFinal 4.9.03 -> http://0.0.0.0:8081
Info: jfinal-undertow 2.2, undertow 2.0.32.Final, jvm 13.0.2
Starting Complete in 1.1 seconds. Welcome To The JFinal World (^_^)
是使用jfinal undertow ,改为这样子Page page=ds.search(1, 10, user.getId(), “社会”);可以获取到数据,如果是前端get或者post请求,传递的中文参数全部都获取不到数据,控制台也没有报错,就是title打印出来一直都是社会

yuwen01

2020-12-22 14:28

@yuwen01 打印出来的是“\&\#31038;\&\#20250;”

yuwen01

2020-12-22 14:28

中间斜杠防止又变成中文

yuwen01

2020-12-22 14:30

@steven_lhcb_9527 使用的是jfinal undertow2.2

steven_lhcb_9527

2020-12-22 14:36

@yuwen01 兄弟,你的JDK版本是JDK13吗,我用的是jdk8。可能会存在与高版本的不兼容问题

yuwen01

2020-12-22 14:53

@steven_lhcb_9527 项目用的是jre1.8,电脑安装的是jdk13

steven_lhcb_9527

2020-12-22 14:58

@yuwen01 你都用jdk8试试。

steven_lhcb_9527

2020-12-22 16:13

@yuwen01 兄弟好了吗

yuwen01

2020-12-22 17:04

@steven_lhcb_9527 Starting JFinal 4.9.03 -> http://0.0.0.0:8081
Info: jfinal-undertow 2.2, undertow 2.0.32.Final, jvm 1.8.0_171
Starting Complete in 0.9 seconds. Welcome To The JFinal World (^_^)

搜索关键词:"\&\#31038;\&\#20250;"
搜索结果:[]

JFinal-4.9.03 action report -------- 2020-12-22 17:01:23 --------------------------
Url : GET /diary/search
Controller : controller.Diary_c.(Diary_c.java:1)
Method : search
Interceptor : com.jfinal.ext.interceptor.SessionInViewInterceptor.(SessionInViewInterceptor.java:1)
com.jfinal.plugin.activerecord.tx.TxByMethods.(TxByMethods.java:1)
interceptor.GlobalInterceptor.(GlobalInterceptor.java:1)
Parameter : title=社会

yuwen01

2020-12-22 17:05

结果还是不行,搜索关键词:里面双引号和斜杠是我加的,防止平台自动转成中文,我这边程序应该是没有转成中文,使用mysql才会没有结果

yuwen01

2020-12-22 17:27

@steven_lhcb_9527 找到原因了,我开启了
//防Xss注入
me.add(new XssHandler());
所以前端传递中文全部都被转义,我去掉后,正常获取到数据,但是可以被xss攻击

yuwen01

2020-12-22 17:29

@JFinal 找到原因了,我开启了
//防Xss注入
me.add(new XssHandler());
所以前端传递中文全部都被转义,我去掉后,正常获取到数据,但是可以被xss攻击。
这个该怎么破?

steven_lhcb_9527

2020-12-22 17:30

XssHandler应该可以配置正则放行

yuwen01

2020-12-22 17:41

@steven_lhcb_9527 恩,刚刚弄了,OK了,感谢!

steven_lhcb_9527

2020-12-23 10:10

才意识到原来防止XSS攻击很有必要,不做的话可能浏览器会执行恶意脚本,从而读取用户的敏感信息。需要后端和前端一起做,后端要防止存储型和反射型XSS,前端防止DOM型XSS

yuwen01

2020-12-23 14:58

@steven_lhcb_9527 恩,非常重要,我后端就做了,前端就没有