【问题标题】:java break down HttpServletRequest after exception or errorjava在异常或错误后分解HttpServletRequest
【发布时间】:2015-05-20 23:03:45
【问题描述】:

我一直在寻找可以在抛出异常时分解我的请求的方法。 我在我的 jsp 中有一个文件上传,不能超过 2MB。 有 jsp 验证,但在使用 internet explorer 8 或 9 时必须有额外的安全性,因为那里不支持文件 API 或客户端禁用 javascript。

我有一个来自 spring 的 CommonMultipartResolver,它可以在上传更大的文件时正确处理我的请求(它会引发 MaxUploadSizeExceededException)。当我的 ExceptionResolver 处理请求并发送回 ModelAndView 时。

当我上传一个例如 4GB 的文件时,就会出现真正的问题。异常由 multipartResolver 抛出,异常被异常处理程序捕获,并且试图返回一个 modelAndView。尝试返回 modelAndView 需要很长时间才能返回,因为正在处理请求并且文件必须完全上传。

我想分解我的请求并停止处理文件上传,有这方面经验的人吗?

【问题讨论】:

  • 如果不将文件直接流式传输到服务器,则无法确定文件大小。服务器无法访问客户端的文件系统。如果要在客户端检查文件大小并分解,则需要使用客户端文件上传库,例如JQuery File Upload
  • 看看herehere
  • 我不想要 jsp 验证,我实际上想要 java 验证来解决额外的安全问题,因为您将始终能够绕过上传文件的前端。所以我想分解请求而不是处理整个文件。处理文件时抛出异常,但是当我重定向到我的原始页面或另一个(没关系)时,它需要很长时间,因为文件仍然需要处理......
  • @Bond-JavaBond 我不能使用分块文件上传,因为 IE8 和 9 不支持这个。这也可以通过在没有前端的情况下执行 restcall 来绕过......我只需要 java 来取消处理和重定向的请求。

标签: java spring jsp file-upload spring-webflow


【解决方案1】:

有 jsp 验证,但在使用 internet explorer 8 或 9 时必须有额外的安全性,因为那里不支持文件 API 或客户端禁用 javascript。

这取决于。您是否需要完全支持阻止脚本和/或使用古老浏览器的人?

如果您能忍受那些刚刚遇到错误的情况,您可以在它们到达您的应用服务器之前阻止过大的请求,即使用 Apache 的 LimitRequestBody 指令。

【讨论】:

  • 为了自己的安全,我确实需要全力支持这些人,如果一些人在服务器上扔了一个 100GB 甚至更多的文件,它将保持处理,并且在某个时候我的服务器的内存将吃饱了,整个事情都会崩溃……
  • 完全支持意味着您的应用会处理错误,因此您可以返回一个漂亮的错误页面。 LimitRequestBody 足以使您的服务器安全,但客户端会看到浏览器生成的错误 - afaik apache 只是终止连接(并发送 HTTP 4xx 代码?不确定,我只用它来保护一些 SOAP 服务) 以防请求太大。
  • 我想试试这个,但我不知道如何让它工作。我有一个在 java 6 和 spring 3 中运行的 jboss,我想在我的 webflow 中上传一个文件,该文件在 xml 配置中定义。我的猜测是你没有足够的信息,但我真的不知道你需要知道什么来帮助我。我只想在特定的流程中指定这一点,因为我不允许那里有大文件,在其他地方可能会有大文件上传。我不必在 jboss 的启动属性文件中设置它吗?
  • 您的 jboss 是在侦听公共 IP、端口 80(不寻常,但可能)还是设置了某种反向代理(即带有 ajp 的 apache,带有 proxy_pass 的 nginx)?如果 jboss 在端口 80 上侦听(客户端直接连接到 jboss),或者您需要向没有 js 或旧 IE 的客户端提供良好的反馈,那么您应该阅读有关分块/多部分上传处理的信息,正如@Java Bond 建议的那样。如果你有一个反向代理,阻止那里的请求会减轻你的 jboss 的负担,因为这些请求甚至不会到达它。
  • 我的 jboss 正在监听 8080,所以没有反向代理,我的客户端直接连接到我的 jboss,它希望将字节数组传递给我的下一步。但是我的 multipartinvoker 正在拦截它以检查字节数组的大小并抛出异常,因为文件太大了。之后,我想立即返回我的页面而不处理请求字节数组的其余部分。上传无法完成,因为我想回去我只想扔掉我的 requestscope 并从那个 flowstep 重新开始。
猜你喜欢
  • 1970-01-01
  • 2010-12-18
  • 2016-05-29
  • 1970-01-01
  • 2010-12-05
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多