Url 字符串 Java Spring MVC

问题描述

我正在为我的工作开发 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。 问题是属性一个字符串,有时名称中可能会有斜杠,例如“事物/其他事物”,我们必须同时使用年份和属性来过滤其他页面。年份取自页面上下文,不会出现问题。

遵循“其他页面”Java 控制器中的代码

@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);
}

现在一切正常。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...