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

Spring Boot如何限制仅提交前序表单后才可访问指定端点?

Spring Boot多步骤表单访问限制实现方案

该需求完全可以实现,核心逻辑是通过会话(Session)标记用户是否完成前序步骤的提交,无需复杂的身份认证配置,具体实现如下:

步骤1:在基础信息提交接口添加完成标记

用户成功提交基础信息表单后,往当前用户的Session中存入第一步已完成的标记,修改GeneralInfoController.java的saveCustomerForm方法:

@PostMapping("/saveInfo")
public String saveCustomerForm(@Valid MainContact mainContact, Model model, HttpSession session) {
    /*
     * 原有业务逻辑保留
     */
    // 存入第一步提交完成的标记
    session.setAttribute("generalInfoSubmitted", true);
    return "redirect:/customers/financialDetails";
}

步骤2:在财务详情页接口添加前置校验

在财务详情页的Get请求接口中,优先校验Session中是否存在第一步的完成标记,不存在则直接重定向回基础信息页,修改financialDetailsController.java的openFinDetailsForm方法:

@GetMapping
public String openFinDetailsForm(Model model, HttpSession session) {
    // 校验是否完成前序步骤
    Boolean hasSubmittedGeneralInfo = (Boolean) session.getAttribute("generalInfoSubmitted");
    if (hasSubmittedGeneralInfo == null || !hasSubmittedGeneralInfo) {
        // 未完成前序步骤,重定向回基础信息页
        return "redirect:/customers/generalInfo";
    }
    model.addAttribute("financialDetails", new FinancialDetails());
    return "financial-details";
}

如果你保留了之前的Spring Security配置,需要将/customers/financialDetails添加到permitAll的路径列表中,避免Security的全局权限拦截覆盖我们自定义的流程校验逻辑,修改后的Security配置示例:

@Override
protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/customers/generalInfo",
                         "/customers/financialDetails",
                         "/assets/**",
                         "/common/**",
                         "/images/**",
                         "/js/**",
                         "/styles/**")
            .permitAll()
            .anyRequest().authenticated();
}

可选优化

如果后续有更多步骤的流程校验需求,可以自定义Spring MVC拦截器做统一的流程状态校验,避免每个接口重复写判断逻辑;如果需要支持用户跨会话继续流程,可以将流程状态和用户标识绑定存入数据库,替代Session存储方案。

额外注意

第二步表单提交完成后,可以手动移除Session中的标记,避免用户重复提交第二步表单,修改saveFinancialForm方法:

@PostMapping("/saveFinancialDetails")
public String saveFinancialForm(@Valid FinancialDetails financialDetails, Model model, HttpSession session) {
    /*
     * 原有业务逻辑保留
     */
    // 移除第一步完成标记,重置流程状态
    session.removeAttribute("generalInfoSubmitted");
    return "redirect:/done";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:15:03