【问题标题】:Java / Spring / Angular.js passing file path to controllerJava / Spring / Angular.js 将文件路径传递给控制器
【发布时间】:2014-08-12 19:06:37
【问题描述】:

我正在尝试根据我通过 dirFile 参数传入的路径从服务器返回一个文件。但是,我无法将 dirFile 参数传递给控制器​​。

这是我在服务器上的控制器:

@RequestMapping(value="/test/getFile/{dirFile}", method = RequestMethod.GET)
public void doDownload(HttpServletRequest request, HttpServletResponse response, 
@PathVariable String dirFile) throws IOException { ...returns file }

以下是我目前拨打电话的方式:

<a ng-href="/Web/test/getFile/{{encodeFileURL(filetree.currentNode.id)}}">Click here to download file</a>

该参数很好地填充并生成以下 URL:

http://localhost:8080/Web/test/getFile/C%3A%5Capache-tomcat-7.0.54%5Clogs%5Cfile.log

如果没有参数,控制器会完成它的工作并返回我硬编码的文件,但我想返回传入的文件。我似乎无法让控制器接受文件路径的参数,它总是返回类似 400 Bad Request Error 的东西。我尝试了一堆不同的弹簧处理程序变体,但找不到有用的东西。我做错了什么?

更新: 这与编码有关。我认为它是用 UTF-8 编码的,而 tomcat 正在使用其他东西。我将尝试以 JSON 或其他方式传递。

【问题讨论】:

  • 发布异常堆栈跟踪。另外,我希望您知道这是一个巨大的安全漏洞:任何人都可以访问运行您的服务器进程的用户可以读取的服务器(甚至网络上的其他机器)的任何文件。
  • 是的,我知道。它将仅限于管理员和可用文件的子集。但有了这个,我只收到 400 Bad Request。

标签: java spring angularjs spring-mvc


【解决方案1】:

这可能是因为默认情况下 Spring 将带有扩展名的 url 视为文件名。尝试将handlerMapping 的属性useSuffixPatternMatch 设置为false

如果您使用 Java 配置:

   public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
        handlerMapping.setUseSuffixPatternMatch(false);
   }

【讨论】:

  • 我不确定问题出在路由处理程序上,反正我也不想碰它,因为我不确定它是否会对所有其他调用产生影响。此外,还有其他调用似乎做同样的事情,只是在这里不起作用。
【解决方案2】:

您可能需要在@PathVariable 注解中设置路径变量名称。 在你的情况下:@PathVariable("dirFile")

【讨论】:

    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2015-12-04
    相关资源
    最近更新 更多