spring mvc重定向_Spring的Web MVC –重定向到内存泄漏

spring mvc重定向

他们说一块岩石会引起雪崩。 最近,我的一位同事Marcin Radoszewski给了我一块岩石。 您可能永远不会猜到它是什么,但是有机会在许多Web应用程序中使用它。 请允许我向您介绍这块石头。

您可能很清楚发布模式后的重定向 。 使用Spring Framework,您有几种方法来实现它,让我们专注于其中一种方法, 将目标URL作为带有redirect: prefix的String返回

假设我们有使用这种重定向方法的控制器,并且在重定向期间必须传递一些参数,例如,使其成为某些实体ID:

@RequestMapping(method = RequestMethod.POST)
public String onPost(...) {
    ...
    return "redirect:form.html?entityId=" + entityId;
}

如您所见,我们的岩石看上去并不危险,甚至看上去都不可疑–这到底是怎么了?! –您可能会问。 好了,要解释一下,我们必须看看Spring Framework如何处理您返回的值的方式。

您可以从阅读Spring Framework文档中的解析视图开始,然后仔细查看AbstractCachingViewResolver的源代码,它是Spring中许多不同的视图解析器的基类,包括:JSP,FreeMarker,Velocity,Jasper Reports,Tiles和XSLT视图解析器。

resolveViewName方法被调用AbstractCachingViewResolver的它采用了基于HashMap的视图缓存加快鉴于在未来的呼叫解决,和缓存关键是使用视图名称和当前语言环境中创建的默认。

现在,当您使用上述重定向方法时, Spring Framework将从控制器方法返回的整个String用作视图名称,包括目标URL中包含的所有参数。 每次执行重定向时,参数可能会有所不同,因此这种重定向将在AbstractCachingViewResolver的视图缓存中留下一个额外的条目,从而导致内存泄漏。

多久会终止我的申请? –您可能会问。 这取决于分配给JVM的内存量以及执行的重定向次数-我使用-Xmx64M选项进行了一些测试,仅通过一个控制器即可构建简单的应用程序-请参见本示例 。 大约76400重定向后,应用程序因OutOfMemoryError:Java heap space终止。

参考: Spring的Web MVC –Warlock's Thoughts博客上从我们的JCG合作伙伴 Michal Jastak 重定向到Memory Leak

翻译自: https://www.javacodegeeks.com/2012/12/springs-web-mvc-redirect-to-the-memory-leak.html

spring mvc重定向

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 中,可以使用重定向和转发来进行请求的跳转。下面是设定重定向和转发的几种方式: 1. 重定向: - 使用 `RedirectView` 类:可以在控制器方法中返回一个 `RedirectView` 对象,设置重定向的目标 URL。 - 使用 `RedirectAttributes` 类:可以在控制器方法中将重定向的目标 URL 添加到 `RedirectAttributes` 对象中,并使用 `redirect:` 前缀来指示重定向。 2. 转发: - 使用 `ModelAndView` 类:可以在控制器方法中返回一个 `ModelAndView` 对象,设置转发的视图名称。 - 使用 `forward:` 前缀:可以在控制器方法中使用 `return "forward:/path"` 的方式来指示转发到指定的路径。 下面是一个示例,展示如何在控制器方法中设定重定向和转发: ```java @Controller public class MyController { @GetMapping("/redirect") public RedirectView redirectToUrl() { RedirectView redirectView = new RedirectView(); redirectView.setUrl("https://www.example.com"); return redirectView; } @GetMapping("/redirectWithAttributes") public String redirectWithAttributes(RedirectAttributes attributes) { attributes.addAttribute("param", "value"); return "redirect:/targetUrl"; } @GetMapping("/forward") public ModelAndView forwardToView() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("forward:/targetView"); return modelAndView; } } ``` 上述代码中,`/redirect` 路径的请求会被重定向到 `https://www.example.com`,`/redirectWithAttributes` 路径的请求会带着参数重定向到 `/targetUrl`,`/forward` 路径的请求会被转发到 `targetView` 视图。 需要注意的是,在设定重定向和转发时,可以使用绝对路径或相对路径,具体根据需求来确定。同时,还可以在路径中使用占位符和路径参数来实现动态的跳转。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值