OK,首先描述下业务场景,终端数量限制登录
1.首先访问项目login的get接口
2.输入账号密码点击登录后,会请求login的POST接口
3.后台对终端数量逻辑处理不允许登录跳回到登录页面
4.因代码原因需在后台进行多次重定向接口,最后跳转静态jsp页面
在a接口中携带参数重定向到b接口中,b接口重定向到登录的jsp页面
但是会发现,跳转到jsp页面后a接口携带的参数拼接到了url中,实际是因为重定向接口实际也是相当于是发送了一次请求,所以才会出现到地址栏中!
话不多说直接上原因:spring MVC框架controller间跳转,需重定向,会将modelAndView中放置的属性值,拼接到重定向url后导致。
解决方案
a接口的接口参数中添加RedirectAttributes并且在return前ra.addFlashAttribute("key","value");这个不影响return ModelAndView!
测试发现参数不会再暴露在url中,并且在jsp页面中可以获取到参数,并且在第一次携带参数后b接口跳转jsp页面前的接口使用@ModelAttribute可以成功接收,再次刷新页面请求b接口,发现参数获取不到,已被清除!
下面是AI对于RedirectAttributes的解释:
RedirectAttributes.addFlashAttribute的值生命周期主要涉及以下几个方面:
一、值的存储与传递
当使用RedirectAttributes.addFlashAttribute("参数","值")方法时,指定的参数和值会被存储起来,以便在重定向后的请求中访问。这个存储过程并不是简单地将参数拼接到重定向的URL上,而是利用了session来暂时保存这些数据。
二、值的生命周期
存储阶段:在调用addFlashAttribute方法时,参数和值被添加到FlashMap中,FlashMap随后被存储到session中。
传递阶段:当执行重定向时,Spring MVC会从session中检索出FlashMap,并将其中的参数和值添加到重定向目标请求的模型中。这样,在重定向后的请求处理中,就可以通过模型访问到这些参数了。
移除阶段:一旦参数和值被添加到重定向目标请求的模型中,它们就会从session中的FlashMap中移除。这意味着,如果用户在重定向后的页面上刷新页面或进行其他操作,这些参数将不再可用。
三、注意事项
安全性:由于addFlashAttribute方法将参数存储在session中,因此相对于将参数直接拼接到URL上(使用addAttribute方法)来说,它更加安全。因为URL上的参数可能会被恶意用户篡改或窃取。
使用场景:addFlashAttribute方法适用于需要在重定向后传递敏感信息或需要在页面上显示一次性消息(如成功或错误消息)的场景。
限制:由于参数和值在重定向后被从session中移除,因此它们无法在重定向后的控制器方法中直接通过@RequestParam注解获取。如果需要在控制器方法中访问这些参数,可以考虑使用其他方法(如通过模型传递或使用@ModelAttribute注解)。
综上所述,RedirectAttributes.addFlashAttribute的值生命周期包括存储、传递和移除三个阶段。在这个过程中,参数和值被安全地存储在session中,并在重定向后的请求中传递和移除。