Flash-атрибуты в Spring MVC 3.1 не видны для перенаправленного JSP - PullRequest
4 голосов
/ 24 января 2012

Я использую новую поддержку Flash Attribute в Spring 3.1, чтобы установить атрибуты flash для объекта RedirectAttributes в Controller, а затем вызывать перенаправление.Этот запрос на перенаправление, в свою очередь, перехватывается фильтром, который затем отправляет его по своему веселому пути в JSP, для которого он предназначен.Проблема: я не вижу атрибуты флэш-памяти ни в методе фильтра doFilter(), ни в JSP.Не-flash (URL) атрибуты делают это просто замечательно.

Контроллер, который выполняет перенаправление:

@RequestMapping("/pages/login")
public String login (HttpServletRequest request, Map<String, Object> model, RedirectAttributes redirectAttributes) {
    model.put("userId", "batman");
    String redirectUrl = request.getParameter("redirectUrl");
    if (redirectUrl != null) {
        redirectAttributes.addAttribute("attr1","ababab");
        redirectAttributes.addFlashAttribute("flashAttr1", "flashflash");
        for (Iterator<String> iterator = model.keySet().iterator(); iterator.hasNext();) {
            String key = iterator.next();
            redirectAttributes.addFlashAttribute(key, model.get(key));
        }
        return "redirect:"+redirectUrl;
    } else {
        return "pages/login";
    }
}

Фильтр, который перехватывает перенаправление, не делает ничего интересного в этом случае:

public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    //if (httpRequest.getSession().getAttribute("userId") == null) {
    //...do some stuff here which invokes controller above as well as the redirect
    //} else {
        chain.doFilter(request, response);
    //}
}

Страница, которая перенаправляется на следующий фильтр:

...
<title>Test Web App 1</title>
</head>
<body>
<p>Flash attribute: <c:out value="${flashAttr1}"/></p>
<p>Welcome <c:out value="${userId}"/>!</p>
</body>
</html>

Ни flashAttr1, ни userId не заполняются на странице.attr1 non-flash атрибут, установленный контроллером, появляется в параметрах URL страницы, поэтому, похоже, он работает.

Вот некоторые выходные данные из log4j после того, как я установил springfamework.web в DEBUG:

19:15:44,406 DEBUG http-8080-1 view.ContentNegotiatingViewResolver:494 - Returni
ng redirect view [org.springframework.web.servlet.view.RedirectView: name 'redir
ect:http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp';
URL [http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp]]
19:15:44,406 DEBUG http-8080-1 servlet.DispatcherServlet:1155 - 
Rendering view [org.springframework.web.servlet.view.RedirectView: name
'redirect:http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp';
URL [http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp]] in
DispatcherServlet with name 'dispatcher'
19:15:44,421 DEBUG http-8080-1 support.DefaultFlashMapManager:199 - Saving Flash
Map=[Attributes={userId=batman, flashAttr1=flashflash}, targetRequestPath=/test-
webapp-1/protected/protected_page.jsp, targetRequestParams={attr1=[ababab]}]
19:15:44,421 DEBUG http-8080-1 servlet.DispatcherServlet:913 - Successfully comp
leted request

После краткой остановки на фильтре, который я показал выше, я попадаю на страницу с URL

http://my_hostname:8080/test-webapp-1/protected/protected_page.jsp?attr1=ababab

Но ни один из атрибутов, которые я ожидаю, что JSP найдетотображаются.Я также отладил с помощью метода doFilter(), показанного выше, и не смог найти атрибуты flash в сеансе запроса.

Я не совсем уверен, что не так на данный момент.Все работает, как и ожидалось, за исключением тех атрибутов flash.Если я еще что-нибудь предоставлю, чтобы прояснить ситуацию, я буду рад.

1 Ответ

2 голосов
/ 22 января 2013

Эта проблема возникла несколько месяцев назад с помощью перенаправлений, связанных с AJAX.Если вы используете шаблон HTTP POST только для чтения, вы можете указать от @ResponseStatus до имитировать a POST.Также убедитесь, что ваш метод возвращает View или ModelAndView (в отличие от String), чтобы Spring знал, как искать область Flash для указанного @RequestMapping.

Псевдокод:

@RequestMapping(...)
@ResponseStatus(OK)
public ModelAndView login (...) {
    ...
}
...