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 没有那个字符。
我正在向我的控制器发送一个带有某些参数的 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 没有那个字符。