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
相关产品推荐
相关产品推荐

