springboot 重定向redirect 并隐藏参数

博客围绕Spring Boot展开,主要讲述在进行全局异常处理时,遇到重定向到全局错误页面的情况。介绍了将参数放于session实现隐藏参数,重定向后清除该值,还提及全局异常处理方法和重定向方法。

在做全局异常处理的时候,碰到重定向到全局错误页面

所谓隐藏参数无非是把参数放到了session中,再重定向后将该值清除

1、全局异常处理方法

@ExceptionHandler(value = Exception.class)
public ModelAndView exceptionHandle(RedirectAttributes redirectAttributes) {
    ModelAndView modelAndView = new ModelAndView("redirect:/systemError");
    redirectAttributes.addFlashAttribute("error", "错误信息");
    return modelAndView;
}

2、重定向方法

@GetMapping("/systemError")
public ModelAndView systemError(@ModelAttribute("error") String error){
    ModelAndView modelAndView = new ModelAndView("error");
    modelAndView.addObject("error", error);
    return modelAndView;
}

 

### 在 Spring Boot 中重定向时保持参数原样的方法 在 Spring Boot 中,如果需要在重定向时保留原始请求中的参数,可以通过多种方式来实现这一需求。以下是几种常见的做法以及其背后的原理。 --- #### 方法一:使用 `RedirectAttributes` 添加参数 通过 `RedirectAttributes` 可以显式地将参数附加到目标 URL 上。此对象允许开发者手动指定要传递的参数将其拼接到最终的重定向 URL 中[^1]。 ```java @PostMapping("/formSubmit") public String handleFormSubmission(@RequestParam Map<String, String> params, RedirectAttributes redirectAttributes) { // 将所有参数添加到 RedirectAttributes 中 params.forEach((key, value) -> redirectAttributes.addFlashAttribute(key, value)); return "redirect:/targetPage"; } ``` 在此示例中,`addFlashAttribute()` 方法不仅会将参数附加到 URL 上,还会存储在临时会话(flash scope)中,从而避免直接暴露复杂或敏感的数据[^1]。 --- #### 方法二:手动构建参数重定向 URL 另一种更直观的方法是直接构造包含所需参数的目标 URL。这通常适用于参数数量较少且不涉及隐私信息的情况。 ```java @GetMapping("/redirectWithParams") public String redirectToAnotherPage(@RequestParam Map<String, String> allRequestParams) { StringBuilder targetUrl = new StringBuilder("redirect:/targetPage?"); allRequestParams.entrySet().forEach(entry -> targetUrl.append(entry.getKey()).append("=").append(entry.getValue()).append("&")); return targetUrl.toString(); } ``` 这种方法简单明了,但需注意编码问题,尤其是当参数值可能包含特殊字符时,建议先对其进行 URI 编码处理[^2]。 --- #### 方法三:利用 `HttpServletRequest` 自动复制现有参数 如果希望完全自动化地保留当前请求的所有参数而无需逐一手动设置,可以借助 `HttpServletRequest` 提供的功能动态生成完整的重定向链接。 ```java import javax.servlet.http.HttpServletRequest; @RestController @RequestMapping("/example") public class ExampleController { @PostMapping("/autoRedirect") public String autoRedirect(HttpServletRequest request) { StringBuilder urlBuilder = new StringBuilder("redirect:/newLocation?"); request.getParameterMap().entrySet().stream() .flatMap(entry -> Arrays.stream(entry.getValue())) .forEach(paramValue -> urlBuilder.append(request.getParameterNames().nextElement()) .append("=") .append(paramValue) .append("&")); return urlBuilder.toString(); } } ``` 尽管这段代码实现了自动化的参数转移逻辑,但在高发环境下可能存在性能瓶颈,因为每次都需要遍历整个参数集合重新组装字符串[^3]。 --- ### 总结 以上三种方案各有优劣: - **推荐优先考虑 Method One (使用 `RedirectAttributes`)** ,因为它既灵活又安全,尤其适合现代 Web 应用开发环境下的大多数场景。 - 若仅需简单的 GET 请求参数转发,则可以选择更为简洁高效的第二种方法。 - 对于极其复杂的业务流程或者追求极致控制力的情形下才应尝试第三种高级技巧。 无论采取哪种策略都务必牢记一点 —— 永远不要让未经验证的外部输入直接影响内部系统的运作机制! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值