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之跨重定向请求传递数据

.NET MVC项目页面请求循环重定向的问题

spring mvc 重定向,地址栏带了参数,不想带怎么办

Spring bootMVC 与 SpringMVC,获取请求参数(CookieSessionHeader)请求转发请求重定向

Spring登录后如何重定向到请求的页面?

Spring 3.0 MVC:重定向而不将参数添加到我的网址