使用SpringMVC在redirect重定向的时候携带参数的问题

目录
  • 在redirect重定向的时候携带参数问题
    • 1. addAttribute
    • 2. addFlashAttribute
  • redirect重定向3种方式(带参数)
    • redirect重定向流程
    • 1. response.sendRedirect重定向跳转
    • 2. ViewResolver直接跳转
    • 3. ModelAndView重定向

在redirect重定向的时候携带参数问题

SpringMVC 中常用到 redirect来实现重定向。但使用场景各有需求,如果只是简单的页面跳转显然无法满足所有要求,比如重定向时需要在 url 中拼接参数,或者返回的页面需要传递 Model。SpringMVC 用 RedirectAttributes 解决了这两个需要。

首先,在 Controller 中做 redirect 中可用如下方式实现:

return new ModelAndView(“redirect:/index”);

return “redirect:/index”;

此时,如果只是重定向至某一 URL 或者比较简单地址,也可以不用 RedirectAttributes,直接拼接,如:return “redirect:/index?param1=value1″;

但是这样似乎有点过于简单粗暴,而且参数多了很容易使代码可读性变差。使用 RedirectAttributes 来设置重定向页面的参数,SpringMVC 会自动拼接 url。

接下来主要介绍该对象的两个方法:

1. addAttribute

@RequestMapping("/save")
public String save(User user, RedirectAttributes redirectAttributes) {
    redirectAttributes.addAttribute("param", "value1");
    return "redirect:/index";
}

请求 /save 后,跳转至/index,并且会在url拼接 ?param=value1。

2. addFlashAttribute

@RequestMapping("/save")
public String save(User user, RedirectAttributes redirectAttributes) {
    redirectAttributes.addFlashAttribute("param", "value1");
    return "redirect:/index";
}

请求 /save 后,跳转至 /index,并且可以在 index 对应的模版中通过表达式,比如 jsp 中 jstl 用 ${param},获取返回值。该值其实是保存在 session 中的,并且会在下次重定向请求时删除。

RedirectAttributes 中两个方法的简单介绍就是这样。

redirect重定向3种方式(带参数)

Spring MVC中做form表单功能提交时,防止用户客户端后退或者刷新时重复提交问题,需要在服务端进行重定向跳转,其中redirect是直接跳转到其他页面,有以下3种方法进行重定向。

redirect重定向流程

客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问test.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。

1. response.sendRedirect重定向跳转

@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })  
public ModelAndView testredirect(HttpServletResponse response){  
    response.sendRedirect("/index");
    return null; 
}

2. ViewResolver直接跳转

不带参数

@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })  
public  String testredirect(HttpServletResponse response){  
    return "redirect:/index";  
} 

带参数

@RequestMapping("/testredirect")
public String testredirect(Model model, RedirectAttributes attr) {
    attr.addAttribute("test", "51gjie");//跳转地址带上test参数
    attr.addFlashAttribute("u2", "51gjie");//跳转地址不带上u2参数
    return "redirect:/user/users";
}

使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面,如上代码即为http:/index.action?test=51gjie

使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,这里的redirect必须是方法映射路径,jsp无效。你会发现redirect后的jsp页面中b只会出现一次,刷新后b再也不会出现了,这验证了上面说的,b被访问后就会从session中移除。对于重复提交可以使用此来完成.

spring mvc设置下RequestMappingHandlerAdapter 的ignoreDefaultModelOnRedirect=true,这样可以提高效率,避免不必要的检索。

3. ModelAndView重定向

不带参数

@RequestMapping(value="/restredirect",method = { RequestMethod.POST, RequestMethod.GET })  
public  ModelAndView restredirect(String userName){  
    ModelAndView  model = new ModelAndView("redirect:/main/index");    
    return model;  
}

带参数

@RequestMapping(value="/toredirect",method = { RequestMethod.POST, RequestMethod.GET })  
public  ModelAndView toredirect(String userName){  
    ModelAndView  model = new ModelAndView("/main/index");   
    model.addObject("userName", userName);  //把userName参数带入到controller的RedirectAttributes
    return model;  
}

小结一下:

1.redirect重定向可以跳转到任意服务器,可以用在系统间的跳转。

2.Spring MVC中redirect重定向,参数传递可以直接拼接url也可以使用RedirectAttributes来处理,由于是不同的请求,重定向传递的参数会在地址栏显示,所以传递时要对中文编码进行处理。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解SpringMVC重定向传参数的实现

    在spring的一个controller中要把参数传到页面,只要配置视图解析器,把参数添加到Model中,在页面用el表达式就可以取到.但是,这样使用的是forward方式,浏览器的地址栏是不变的,如果这时候浏览器F5刷新,就会造成表单重复提交的情况.所以,我们可以使用重定向的方式,改变浏览器的地址栏,防止表单因为刷新重复提交. jsp文件: <%@ page language="java" contentType="text/html; charset=UTF-8&q

  • SpringMVC 重定向参数RedirectAttributes实例

    目录 重定向参数RedirectAttributes 1. addAttribute 2. addFlashAttribute 重定向携带参数问题 问题描述 问题来源 重定向参数RedirectAttributes SpringMVC 中常用到 redirect 来实现重定向.但使用场景各有需求,如果只是简单的页面跳转显然无法满足所有要求,比如重定向时需要在 url 中拼接参数,或者返回的页面需要传递 Model. SpringMVC 用 RedirectAttributes 解决了这两个需要.

  • SpringMVC 重新定向redirect请求中携带数据方式

    目录 SpringMVC 重新定向redirect请求中携带数据 使用URL模版重定向 使用flash属性 SpringMVC 几种重定向携带数据方法 1.拼接字符串 2.采用RedirectAttribute来传参数 3.RedirectAttribute-–addFlashAttribute()的用法 SpringMVC 重新定向redirect请求中携带数据 在控制器方法返回的视图名称中使用了redirect:前缀,这时返回的String不是用来寻找视图,而是浏览器进行跳转的路径: ret

  • 使用SpringMVC在redirect重定向的时候携带参数的问题

    目录 在redirect重定向的时候携带参数问题 1. addAttribute 2. addFlashAttribute redirect重定向3种方式(带参数) redirect重定向流程 1. response.sendRedirect重定向跳转 2. ViewResolver直接跳转 3. ModelAndView重定向 在redirect重定向的时候携带参数问题 SpringMVC 中常用到 redirect来实现重定向.但使用场景各有需求,如果只是简单的页面跳转显然无法满足所有要求,

  • springmvc请求转发和重定向问题(携带参数和不携带参数)

    目录 请求转发的三种方式 1.传统的请求转发 2.SpringMVC中不经过视图解析器的请求转发 3.请求转发经过视图解析器 重定向 1.传统的重定向 2.SpringMVC中不带参数的重定向 3.SpringMVC中带参数的重定向 请求转发的三种方式 SpringMVC请求转发区别于重定向,请求转发地址栏不会发生改变.只发送一次请求.能携带原有的参数,但只可以在同一个服务器中进行转发. 1.传统的请求转发 @RequestMapping("/forwardCommon") publi

  • 简单谈谈SpringMVC转发和重定向的区别

    在servlet中,转发和重定向是由request和response完成的.两者之间的区别请看我之前的文章.那么在springMVC中是如何完成的呢? /**转发**/ @RequestMapping("/login.do") public String login(HttpServletRequest request,HttpServletResponse response){ request.setAttribute("message", "hello

  • SpringMVC视图转发重定向区别及控制器示例详解

    目录 SpringMVC视图 一.ThymeleafView 二.转发视图 三.重定向视图 四.转发和重定向区别 五.视图控制器 view-controller SpringMVC视图 SpringMVC 中的视图是 View 接口,视图的作用是渲染数据,将模型 Model 中的数据展示给用户. 视图的种类很多,默认有:转发视图和重定向视图. 若使用的视图技术为 Thymeleaf,在 SpringMVC 的配置文件中配置了 Thymeleaf 的视图解析器,由此视图解析器解析之后所得到的是 T

  • 基于vue-router 多级路由redirect 重定向的问题

    在做多级路由的时候遇到很多问题,虽然不难,但是如果没有经验,往往要花一整天时间才能解决(可能我笨),况且网上资料也很少. 项目需要是这样的: 登录页面跳到后台页面重定向,登录页是一级路由 对应页面 登录后: 同时重定向二级和三级页面, 这样登录就会重定向了,此时url 但又有一个问题:当再次点击底部"堂食"的时候, url变成这样,并且三级页面没有出来 解决办法是:在这个"堂食"按键 添加一个方法 记住,也只有这样传参才有效 如果在<router-link&g

  • 浅谈在django中使用redirect重定向数据传输的问题

    环境: python 3.6.4 django2.0.6 使用重定向redirect('url name') 如果不需要传数据的话那这样就OK了 如果要传数据的话 我琢磨了半天 还是决定用session来传输 所以 就这么干: request.session['key_name] = value request.session['msg'] = u'用户未登录' 然后在模板中使用: <h1>{{ request.session.username }}</h1> {# 输出usern

  • vue中关于redirect(重定向)初学者的坑

    目录 关于redirect(重定向)初学者的坑 vue-router路由重定向redirect的使用事项 关于redirect(重定向)初学者的坑 第一个对象里是配置路由重定向path:’/'为项目的根目录,redirect重定向为渲染的路径(这里我是指向了第二个对象里的path) 所以就要写第二个对象方便 redirect 找到它.. 第二个对象里的配置path:’/index’是自定义的路径,component / Customers组件名称 还有一种是 children 如下图: 首页名字

  • 前端HTTP发POST请求携带参数与后端接口接收参数的实现

    目录 HTTP的GET请求与POST请求 常见HTTP内容类型Content-Type 后端收参方式-前端对应传参方式 application/json multipart/form-data 总结 参考 HTTP的GET请求与POST请求 HTTP请求方式有GET.POST.PUT.DELETE等八种,最常见的就是GET.POST,下面说一下GET请求,很简单. GET是按照规定参数只能写在URL里面(虽然可以有请求体但是不符合规定),没有请求体也就是data,那传就非常简单了,前端就是字符串

  • Android OkHttp Post上传文件并且携带参数实例详解

    Android OkHttp Post上传文件并且携带参数 这里整理一下 OkHttp 的 post 在上传文件的同时,也要携带请求参数的方法. 使用 OkHttp 版本如下: compile 'com.squareup.okhttp3:okhttp:3.4.1' 代码如下: protected void post_file(final String url, final Map<String, Object> map, File file) { OkHttpClient client = n

  • 解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题

    新配置一个spring的MVC项目,发现对Get请求的中文参数出现了乱码: 查看了SpingMVC中关于编码的配置(在web.xml中),如下: <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param>

随机推荐