问题描述
我正在为我的工作开发 Java Spring MVC 应用程序。当我们在 URL 中有斜杠时,我们总是遇到问题。我们使用的是 Java 8 和 Tomcat 7。 在“当前页面”的 JSP 中,我们有这个 href:
<td style="vertical-align: middle;"><a id="column" style="color: #EB9316" href="${pageContext.request.contextpath}/user/other-page/${c.property}/${dto.year}">${c.property}</a></td>
这里我们传递对象的属性和年份作为参数。在“其他页面”中,我们获取属性和年份并过滤 DB 上的对象 c。 问题是属性是一个字符串,有时名称中可能会有斜杠,例如“事物/其他事物”,我们必须同时使用年份和属性来过滤其他页面。年份取自页面上下文,不会出现问题。
@GetMapping("/user/other-page/{property}/{year}")
public String homeUserOtherPageFilter(@PathVariable String property,@PathVariable Integer year,RedirectAttributes attributes) {
property= URLDecoder.decode(property,"UTF-8");
attributes.addFlashAttribute("property",property);
attributes.addFlashAttribute("year",year);
return "redirect:/user/other-page";
}
使用名称中的斜杠,我收到错误 404。我尝试在“当前页面”java 控制器中使用此代码对斜杠进行编码。
try {
for (chapter chapter: chapters) {
chapter.setProperty(URLEncoder.encode(chapter.getproperty(),"UTF-8"));
}
} catch (UnsupportedEncodingException e){
logger.debug("Url encode Failed ",e);
}
但这仍然不起作用,即使使用 URL 编码的 Tomcat 也会给我错误 404,甚至无法到达其他页面控制器进行解码。如果我在“当前页面”中的 2020 页面上单击“事物/其他事物”链接,则准确的错误是:
请求的资源 [/application/user/other-page/2020/thing%2Fotherthing] 不可用
当然,没有斜线的属性一切正常。我做错了什么?
解决方法
编辑:我解决了这个问题。出于某种奇怪的原因,Tomcat 不喜欢将“/”转换为“%2F”,但出于某种我不知道的原因,它接受了“/”的编码为“%252F”,这是通过对参数编码两次而给出的。所以我只需要将当前页面Java控制器中的代码更改为
try {
for (chapter chapter: chapters) {
chapter.setProperty(URLEncoder.encode(URLEncoder.encode(chapter.getProperty(),"UTF-8"),"UTF-8"));
}
} catch (UnsupportedEncodingException e){
logger.debug("Url encode failed ",e);
}
现在一切正常。