更改GET页面请求的数据(处理预加载请求)

Rei*_*ins 15 java spring portlet spring-mvc

我有一个portlet.当portlet加载时,则在呈现第一个视图之前,在某些情况下需要调用更改数据库中数据的存储库.我不会详细说明为什么这是必要的,关于这是一个设计缺陷的答案是没有用的.我知道这是一个设计缺陷,但我仍然希望找到以下问题的替代解决方案:

这种设置的问题是浏览器发送预加载请求.例如,portlet所在页面的URL是/ test-portlet.现在,当您在地址栏中键入它时,如果您在浏览器历史记录中输入它,则浏览器会在向您建议时向页面发送GET请求.如果在解析第一个GET请求之前按Enter键,则浏览器会发送新的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";
}
Run Code Online (Sandbox Code Playgroud)

我会对阻止第一次执行的解决方案感兴趣.例如,某些从控制器重定向到POST的浏览器不会触发.不确定它是否可以实现.

小智 1

使用锁我认为你可以解决这个问题,让第二个请求等待第一个请求完成然后处理它。我没有java中锁的经验,但我发现了另一篇关于jave中文件锁的堆栈交换帖子: How can I lock a file using java (if possible)