在SpringBoot项目开发中,某个需求需要将错误中文信息字符串转发给对应的Controller处理,于是我就先将中文字符串使用URLEncoder.encode(message, "UTF-8")进行编码,然后将编码后的字符串拼接到URL之后,使用httpServletResponse.sendRedirect重定向到目标Controller,其代码如下:
/**
* 将非法请求转到 /unauthorized/** 处理
*/
private void responseError(ServletResponse response, String message) {
try {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
message = URLEncoder.encode(message, "UTF-8");
httpServletResponse.sendRedirect("/unauthorized/" + message);
} catch (IOException e) {
e.printStackTrace();
}
}
在Controller中,使用@RequestMapping(value="/unauthorized/{message}") 来获取路径上的动态参数message,其代码如下:
@RequestMapping(value="/unauthorized/{message}")
public ResultMap unauthorized(@PathVariable("message") String message){
return ResultMap.fail(message);
}
在测试中发现,编码后的中文字符串类似于 %E7%99%BB%E5%BD%95%E8%BA%AB%E4%BB%BD%E5%A4%B1%E6%95%88 形式,重定向时发生了请求不断循环的情况,Controller无法捕获该请求,最后报错 Error: Exceeded maxRedirects. Probably stuck in a redirect loop.
但是当我把参数字符串中的%去掉以后,Controller方法就可以正常捕获处理该请求了,于是我猜测是@RequestMapping 无法匹配%这个特殊字符,请问有人有解决方法吗?
你这个使用全局异常,不更好处理?
或者使用转发,request.setAttr带数据过去
你这种场景建议用:**@RequestParam**(value=”参数名”,required=”true/false”,defaultValue=””)
@PathVariable:针对ID或者简短固定的!万一{message}匹配出来与另一个路径相同,那就尴尬了……(而且还有可能有注入的风险)