Spring MVC - сохранить параметры запроса после перенаправления - PullRequest
4 голосов
/ 13 марта 2012

У меня есть ситуация, когда мой веб-разработчик хочет добавить несколько параметров для каждой ссылки. Он нуждается в них в качестве параметров в представлении, на которое указывает ссылка.

Каждый метод @Controller будет возвращать только строки. Это поддерживается стандартным средством просмотра, использующим указанную строку в качестве имени представления:

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

Всякий раз, когда Контроллер возвращает redirect:, параметры запроса из исходного запроса удаляются, и он не может получить к ним доступ в .jsp

Есть ли какой-нибудь изящный способ гарантировать, что даже после redirect: 'параметры url присутствуют в представлении, которое было перенаправлено на?

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Вам нужен флеш прицел.Он уже реализован начиная с весны 3.1.RC1 - см. Запрос

2 голосов
/ 13 марта 2012

Так как решения, предложенные Божо, где не совсем подходят для моих нужд, я написал фильтр, который делает именно то, что я хочу. Не уверен, что в будущем могут возникнуть какие-либо проблемы, но до тех пор не стесняйтесь использовать мою реализацию:

/**
*
* @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;
    }

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...