You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

全栈应用:非用户定义字段应在前端还是后端填充?

关于JHipster中Post实体自动填充dateCreated和userID的最佳实践

嘿,作为用JHipster搭过不少项目的开发者,我来给你明确说下:这两个字段绝对要在后端(Spring)填充,前端填充的方式完全不可取,原因和具体实现方法我给你拆解下~

为什么必须选后端?

  • 前端数据完全不可信:用户随便改前端代码、抓包篡改请求参数,就能把dateCreated改成任意时间,甚至伪造userID冒充别人发帖子,这会直接导致你的数据库数据失真,毫无安全性可言。
  • 逻辑统一易维护:如果以后除了前端页面,还有其他创建Post的渠道(比如后台管理API、批量数据导入),后端填充的话不用重复写逻辑,所有创建操作都会自动触发字段填充,维护成本低很多。
  • 贴合JHipster原生特性:JHipster本身就集成了Spring Data JPA的审计功能,刚好能完美解决这个需求,不用自己从零写冗余代码。

具体实现步骤(基于Spring Data JPA审计)

1. 改造Post实体类

给需要自动填充的字段加上审计注解,并启用实体监听:

import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.time.ZonedDateTime;

@Entity
@EntityListeners(AuditingEntityListener.class) // 开启审计监听
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String text;

    @CreatedDate // 自动填充创建时间
    private ZonedDateTime dateCreated;

    @CreatedBy // 自动填充创建者ID
    private String userID;

    // 构造函数、getter、setter...
}

2. 开启Spring Boot的JPA审计支持

在你的应用主类上添加@EnableJpaAuditing注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class YourJHipsterApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourJHipsterApplication.class, args);
    }
}

3. 实现AuditorAware接口(获取当前登录用户ID)

这个类用来告诉Spring Security当前登录用户的ID,JHipster默认可能已经生成了类似的类,如果没有的话自己写一个:

import org.springframework.data.domain.AuditorAware;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        // 从Security上下文获取当前登录用户的ID,根据你的实际认证逻辑调整
        String currentUserId = SecurityContextHolder.getContext().getAuthentication().getName();
        return Optional.ofNullable(currentUserId);
    }
}

为什么不推荐前端填充?

前端填充的问题很多:

  • 客户端时间和服务器时间可能不一致,导致dateCreated不准确;
  • userID可以被轻易篡改,无法保证数据的真实性;
  • 如果后续新增创建渠道,前端逻辑需要重复编写,维护性差。

内容的提问来源于stack exchange,提问作者Antifa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:16