Spring MVC Url 为什么我在 url 中编码换行符时得到 404

Spring MVC Url Why do I get a 404 when I encode a linefeed in the url

我正在向我的控制器发送一个带有某些参数的 url,它通常工作正常。我正在使用 javascript 函数 encodeURI() 对参数进行编码。

但是一旦出现换行,我就会收到 404 错误。

这是一个有效的 url:

http://localhost:8080/Weasy/virtualtable/execQuery/46/select%20*%20from%20payment

这是一个无效的 url:

http://localhost:8080/Weasy/virtualtable/execQuery/46/select%20*%20%0Afrom%20payment

这是我的控制器方法:

@RequestMapping("execQuery/{schema_id}/{query}")
public ModelAndView execQuery(
        @PathVariable("schema_id") Integer schemaId
      , @PathVariable("query") String query) throws Exception {

    SrcSchema schema = this.srcschemaService.getRowById(schemaId);

    ModelAndView mav = new ModelAndView("virtualtable/form");
    mav.addObject("schema", schema);
    mav.addObject("query", query);


    try {
        int limit = 10;
        List<Map<String, Object>> rows = jdbcService.executeQuery(schema.getConnection(), query, limit);             
        mav.addObject("rows", rows);
        mav.addObject("message", "<span class='msg-info'>Result Set reduced to "+limit+" rows</span>");
    } catch (Exception ex) {
        logger.error("Error executing sql", ex);            
        mav.addObject("message", "<span class='msg-error'>"+ex.getMessage()+"</span>");

    }


    return mav;
} 

为什么不起作用?

我认为这不是您的应用程序。我猜是您的网络服务器阻止了请求,因为您使用的是一个奇怪的字符。例如,Apache 拒绝访问包含 %2F (/)、%5F (\) 或 %00 (NULL) 的 urls。通常,%00 和 %1F 之间的 ASCII 字符,称为控制字符,不应出现在 urls 处,%0A 就是其中之一。

我的建议是,在执行请求之前,您应该分析您的查询并删除,不仅是 %0A,还有任何有问题的字符。

如果您仍然想让它工作,我认为您需要在您的 .htaccess 中包含一个重写规则(我猜您使用的是 Apache),并使用正则表达式删除换行符并重定向到相同的 url 没有那个字符。

Apache URL Rewriting Guide