Spring MVC - 重定向后保留请求参数
Posted
技术标签:
【中文标题】Spring MVC - 重定向后保留请求参数【英文标题】:Spring MVC - keep request parameters after redirect 【发布时间】:2012-03-13 14:38:08 【问题描述】:我的前端开发人员想为每个链接添加几个参数。他需要这些作为链接指向的视图中的参数。
每个@Controller
方法将只返回字符串。这是由使用所述字符串作为视图名称的标准视图解析器支持的:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
然而,当控制器返回redirect:
时,原始请求中的请求参数将被删除,他无法在.jsp 中访问它们
是否有任何巧妙的方法可以确保即使在redirect:
'ing 之后,url 参数也会出现在重定向到的视图中?
【问题讨论】:
【参考方案1】:您需要一个闪光灯瞄准镜。它已经从 spring 3.1.RC1 开始实施 - see the request
【讨论】:
所以我基本上必须用RedirectAttributesModelMap
替换@Controller
方法中的ModelMap
,它应该可以工作吗?
我不完全确定它是如何工作的——也许 Rossen Stoyanchev 的最后一条评论应该能有所启发。请让我知道它是否有效。
乍一看,它是行不通的。 RedirectAttributesModelMap
不能用作 ModelMap
的替代品,因为每个值都将存储为字符串表示形式。而且我的大多数方法都需要存储和处理对象,通过 ModelMap 传递。
我目前正在研究拦截器。拦截每个请求,提取请求参数并放入模型中。但是,我的前端人员在 .jsp 中以 $param.nameOfTheUrlParam 的形式访问它们,这是标准的。不确定这是否仍然有效。【参考方案2】:
由于 Bozho 建议的解决方案不能满足我的需求,因此我编写了一个过滤器,它完全符合我的要求。不确定在未来的情况下是否会出现任何问题,但在那之前,请随意使用我的实现:
@Service
public class RedirectFilter implements Filter
@Override
public void init(FilterConfig filterConfig) throws ServletException
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
String queryString = ((HttpServletRequest) request).getQueryString();
if (queryString != null)
RedirectAwareResponseWrapper res = new RedirectAwareResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, res);
if (res.isRedirected())
((HttpServletResponse) response).sendRedirect(res.getLocation() + "?" + queryString);
else
chain.doFilter(request, response);
@Override
public void destroy()
class RedirectAwareResponseWrapper extends HttpServletResponseWrapper
private boolean redirected = false;
private String location;
public RedirectAwareResponseWrapper(HttpServletResponse response)
super(response);
@Override
public void sendRedirect(String location) throws IOException
redirected = true;
this.location = location;
//IMPORTANT: don't call super() here
public boolean isRedirected()
return redirected;
public String getLocation()
return location;
【讨论】:
以上是关于Spring MVC - 重定向后保留请求参数的主要内容,如果未能解决你的问题,请参考以下文章
Spring bootMVC 与 SpringMVC,获取请求参数(CookieSessionHeader)请求转发请求重定向