2017-02-10 54 views
0

我正在向我的控制器发送一个带有特定参数的URL,这通常很好。我正在使用javascript函数encodeURI()对参数进行编码。Spring MVC Url为什么我在URL中对换行进行编码时会得到404

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

这是一个工作URL:

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

这是一个非工作网址:

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

为何不工作?

回答

0

我不认为这是你的应用程序。我想这是你的Web服务器在你使用奇数字符时阻止了请求。例如,Apache拒绝访问包含%2F(/),%5F(\)或%00(NULL)的网址。通常情况下,%00和%1F之间的ASCII字符(称为控制字符)不应出现在URL中,并且%0A是其中之一。

我的建议是你应该解析你的查询,摆脱,不仅是%0A,而且还有任何有问题的角色,在做请求之前。

如果你仍然想让它工作,我认为你需要在你的.htaccess中包含一个rewriterule(我猜你正在使用Apache),并使用正则表达式来删除换行符并重定向到相同的URL那个角色。

Apache URL Rewriting Guide