【发布时间】:2015-08-04 09:14:43
【问题描述】:
我有一个 portlet。当 portlet 加载时,在第一个视图被渲染之前,在某些情况下需要调用一个存储库来更改数据库中的数据。我不会更详细地说明为什么这是必要的,并且关于这是一个设计缺陷的答案没有帮助。我知道这是一个设计缺陷,但我仍然想找到以下问题的替代解决方案:
这种设置的问题在于,浏览器会发送预加载请求。例如,portlet 所在页面的 URL 是 /test-portlet。现在,当您在地址栏中键入它时,如果您的浏览器历史记录中有它,那么当浏览器向您建议时,它已经向该页面发送了一个 GET 请求。如果在第一个 GET 请求被解析之前按下回车,那么浏览器会发送一个新的 GET 请求。这意味着 portlet 接收到 2 个单独的请求,它开始并行处理这些请求。第一个数据库过程可能正常工作,但考虑到数据库过程的性质,第二个调用通常会出现异常。
从 Java 应用程序中处理上述问题的好方法是什么?
旁注:我正在使用 Spring MVC。
一个可能的控制器的简单示例:
@RequestMapping
public String index( Model model, RenderRequest request ){
String username = dummyRepository.changeSomeData(request.getAttribute("userId"));
model.add("userName", username);
return "view";
}
我会对完全阻止第一次执行的解决方案感兴趣。例如,某种浏览器不会触发的从控制器到 POST 的重定向。但不确定是否可以实现。
【问题讨论】:
-
您检查过请求标头吗?是否有任何标题表明您处于“预加载”场景?在这种情况下,您可以跳过任何需要跳过的内容。
-
你能简单描述一下你的数据库程序是什么吗??
-
@MSIbrahim 我刚刚简化了场景。实际上有一个 REST API 调用可以操作 2 个数据库。我认为这无关紧要,因为我当然不想在较低级别上进行更改,因为这完全是 Web 层的问题。
-
你需要什么顺序来运行你的项目你有任何想法,比如获取/重定向/发布类似的东西
-
@MSIbrahim 有点不清楚你的问题到底是什么。正如我在最初的问题中所述,我有一个可能的获取/重定向/发布(“例如某种从控制器到 POST 的重定向,浏览器不会触发。但不确定它是否可以实现。”),但我不确定如何在这种情况下实现它,或者即使它可能或有效。
标签: java spring spring-mvc portlet