Spring MVC-重定向后保留请求参数


问题内容

我的前端开发人员想在每个链接中添加几个参数。他需要这些参数作为链接指向的视图中的参数。

每个@Controller方法将仅返回字符串。这是由标准的viewresolver支持的,使用上述String作为viewname:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

每当Controller返回a redirect:时,原始请求中的请求参数都会被丢弃,并且他无法在.jsp中访问它们

是否有任何整洁的方法来确保即使在redirect:‘ing后,重定向到的视图中也存在url参数?


问题答案:

由于Bozho提出的解决方案不能完全满足我的需求,因此我编写了一个过滤器,该过滤器完全可以满足我的需求。不知道将来是否会发生任何问题,但是在此之前,请随时使用我的实现:

/**
*
* @author Lennart Koester (University of Innsbruck, 2012)
*/
@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;
    }

}
}