首页 > 解决方案 > 如何防止控制器方法在 Chrome 浏览器的 Spring Boot 中运行两次?

问题描述

我正在使用带有 postgresql 的 spring boot 来保存表中的行并打印表行。我的问题是所有 WebController 方法都被执行了两次,但只有当我在 chrome 中打开 url 时。如果我在 Internet Explorer 中执行此操作,则效果很好。我怎样才能在 chrome 中阻止这个?

我将四个文件的代码作为参考,尽管我认为代码没有任何问题。我需要更改浏览器设置吗?

用户.java

@Entity
@Table(name="users")
public class User implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name="name")
    private String name;

    @Column(name="email")
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    @Override
    public String toString() {
        return String.format("User[id=%d, name='%s', email='%s']",this.id,this.name,this.email);
    }
}

用户存储库.java

public interface UserRepository extends JpaRepository<User, Long>{

}

WebController.java

@RestController 
public class WebController {

    @Autowired
    private UserRepository repository;

    @GetMapping("home")
    public String home() {
        System.out.println("whaaat");
        return "hi";
    }

    @GetMapping("/save")
    public String process() {

        repository.save(new User("vidhi","vd@gmail.com"));
        System.out.print("apple ");
        return "Done";
    }

    @RequestMapping("findall")
    public String findAll() {
        String result = "";

        for(User u: repository.findAll()) {
            result += u.toString() + "<br>";
        }

        return result;
    }

}

应用程序属性

spring.datasource.url=jdbc:postgresql://localhost:5432/test
spring.datasource.username=postgres
spring.datasource.password= 
spring.jpa.generate-ddl=true
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false

我知道这些方法运行了两次,因为在表中添加了两次行,并且“whaaat”在控制台中打印了两次,但仅在 chrome 中打印。任何帮助都会很棒。

谢谢你的时间。

标签: javaspringspring-boot

解决方案


第一的。尝试 Chrome 开发人员工具中的“网络”选项卡(尝试 F12 按钮)以确定实际发送了多少请求。 在此处输入图像描述

第二。在“GET”请求中保存任何数据通常不是一个好主意,因为它的语义,浏览器不期望服务器端发生变化并且可以多次调用请求(不能为此产生用例,但它完全不禁止浏览器这样做)或从缓存中获取它。


推荐阅读