Spring MVC中redirect重定向几种方式(重构)

简介

在Web应用开发中,用户在提交表单后刷新页面或点击后退按钮,可能导致表单被重复提交,这会引发多种问题,如重复下订单等。为了避免这种情况,我们可以利用HTTP重定向(redirect)机制,在服务器端进行重定向跳转,从而有效防止表单的重复提交。

什么是Redirect重定向

HTTP重定向是Web开发中一种常用的技术,通过服务器指示客户端浏览器转到另一个URL地址。它的工作流程简单描述如下:

  • 客户端发送请求到服务器。
  • 服务器处理请求后,通过发送特定的HTTP响应头(如Location)来通知客户端需要进行再次请求的新URL。
  • 客户端接收到这个响应后,自动向新的URL发起请求。

这个过程中,初始请求和重定向请求是完全独立的,所以在第一个请求中设置的任何属性(通过setAttribute方法)在后续的请求中都是不可获取的。

Spring MVC中实现Redirect的方法

在Spring MVC框架中,我们有多种方式实现重定向,下面介绍四种常用的方法:

1. 使用HttpServletResponsesendRedirect方法
java 复制代码
@RequestMapping(value="/testredirect", method = {RequestMethod.POST, RequestMethod.GET})
public ModelAndView testRedirect(HttpServletResponse response) {
    response.sendRedirect("/index");
    return null;
}

这种方法是最直接的,通过response.sendRedirect调用实现重定向。

2. 通过返回字符串实现重定向
  • 不带参数的重定向
java 复制代码
@RequestMapping(value="/testredirect", method = {RequestMethod.POST, RequestMethod.GET})
public String testRedirect() {
    return "redirect:/index";
}
  • 带参数的重定向
java 复制代码
@RequestMapping("/testredirect")
public String testRedirect(Model model, RedirectAttributes attr) {
    attr.addAttribute("test", "51gjie"); // URL后带上test参数
    attr.addFlashAttribute("u2", "51gjie"); // 不在URL后,保存在session
    return "redirect:/user/users";
}

使用RedirectAttributes可以控制哪些参数需要通过URL传递,哪些通过session传递但不显示在URL上。

3. 使用ModelAndView进行重定向
  • 不带参数
java 复制代码
@RequestMapping(value="/restredirect", method = {RequestMethod.POST, RequestMethod.GET})
public ModelAndView restRedirect() {
    return new ModelAndView("redirect:/main/index");
}
  • 带参数
java 复制代码
@RequestMapping(value="/toredirect", method = {RequestMethod.POST, RequestMethod.GET})
public ModelAndView toRedirect(String userName) {
    ModelAndView model = new ModelAndView("redirect:/main/index");
    model.addObject("userName", userName);
    return model;
}

ModelAndView方法提供了一种更灵活的方式来处理重定向和参数传递。

4. 直接跳转到某个网页
java 复制代码
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
httpServletResponse.sendRedirect("http://srip.cpu.edu.cn/#/admins");

这种方式可以用来实现跨域的重定向跳转。

参数传递

在重定向中传递参数有两种方式:直接在URL中拼接参数,或者使用RedirectAttributes。直接拼接URL的方式简单直观,但所有参数都会暴露在地址栏中。使用RedirectAttributes可以更安全地传递参数,部分参数可以通过session传递而不在URL中显示,但需要注意的是,使用addFlashAttribute添加的参数,一旦被读取即会从session中移除,这有助于防止信息泄露。

总结

重定向是解决Web应用中重复提交问题的有效手段。在Spring MVC中,我们可以选择不同的方法来实现重定向,每种方法都有其适用场景。通过合理使用重定向及参数传递机制,可以提高应用的安全性和用户体验。

相关推荐
云空1 天前
《当机器人有了“鸿蒙大脑”:M-Robots OS如何重构产业生态?》
重构·机器人·harmonyos
王桑.1 天前
Spring中IoC的底层原理
java·后端·spring
雨雨雨雨雨别下啦1 天前
Spring AOP概念
java·后端·spring
on the way 1231 天前
day04-Spring之Bean的生命周期
java·后端·spring
一水鉴天1 天前
整体设计 定稿 之29 整体设计表述总表 的专用读表工具-自然语言处理(codybuddy)
人工智能·自然语言处理·重构
老蒋新思维1 天前
创客匠人:小团队的知识变现革命 —— 超级个体 + 多智能体如何重构组织价值
服务器·网络·人工智能·重构·创始人ip·创客匠人·知识变现
paopaokaka_luck1 天前
基于SpringBoot+Uniapp的自习室预约小程序(腾讯地图API、Echarts图形化分析、二维码识别)
vue.js·spring boot·后端·spring·echarts
一水鉴天1 天前
整体设计 定稿 之 5 讨论问题汇总 和新建 表述总表/项目结构表 文档分析,到读表工具核心设计讨论(豆包助手)
数据库·人工智能·重构
一人の梅雨1 天前
1688 商品详情接口深度解析:从百川签名突破到供应链数据重构
java·微服务·重构
hh.h.1 天前
低代码平台重构:Flutter组件库与鸿蒙分布式能力融合实践
flutter·低代码·重构