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

我有一个 portlet。当 portlet 加载时,在第一个 View 被渲染之前,在某些情况下需要调用一个存储库来更改数据库中的数据。我不会更详细地说明为什么这是必要的,并且关于这是一个设计缺陷的答案没有帮助。我知道这是一个设计缺陷,但我仍然想找到以下问题的替代解决方案:

这种设置的问题在于,浏览器会发送预加载请求。例如,portlet 所在页面的 URL 是/test-portlet。现在,当您在地址栏中键入它时,如果您的浏览器历史记录中有它,那么当浏览器向您建议时,它已经向该页面发送了一个 GET 请求。如果在第一个 GET 请求被解析之前按下回车,那么浏览器会发送一个新的 GET 请求。这意味着 portlet 接收到 2 个单独的请求,它开始并行处理这些请求。第一个数据库过程可能正常工作,但考虑到数据库过程的性质,第二个调用通常会出现异常。

从 Java 应用程序中处理上述问题的好方法是什么?

旁注:我正在使用 Spring MVC。

一个可能的 Controller 的简单示例:

@RequestMapping
public String index( Model model, RenderRequest request ){
    String username = dummyRepository.changeSomeData(request.getAttribute("userId"));
    model.add("userName", username);
    return "view";
}

我会对完全阻止第一次执行的解决方案感兴趣。例如,某种浏览器不会触发的从 Controller 到 POST 的重定向。但不确定是否可以实现。

最佳答案

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

https://stackoverflow.com/questions/30395152/

相关文章:

java - 无法反序列化 Spring Session Scoped bean

java - SpringBoot 应用中的@RabbitListener 方法测试

java - 如何访问 Thymeleaf 模板中的系统属性?

spring - 在 Spring Boot 中从 FTP 发送和接收文件

spring - 在 Spring 中使用 @PropertyResource 访问多个属性文件

java - 如何使用modelAttribute在ajax(jquery)中提交spring表单

java - 通过 Spring Config 扫描 Spring Data 存储库?

java - Hibernate 和 PostgreSQL 中具有 UserType 的数组 -->

mysql - BatchingBatcher "JDBC driver did not retur

java - Spring Batch 异步处理器配置以获得最佳性能