2012-01-24 1 views
4

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

контроллер, который делает редирект:

@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 в конечном итоге заполняется на странице. Атрибут non-flash attr1, установленный контроллером, отображается в параметрах 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(), показанный выше, и не смог найти атрибуты вспышки в сеансе запроса.

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

+0

И, конечно, у меня есть '' установить (наряду со свойством не установить модель атрибуты, как URL Params) :-) –

+0

Вы можете удалить фильтр и посмотреть? – Abhi

+0

Подумав об этом немного, я считаю, что суть проблемы связана с тем фактом, что здесь действительно задействован Redirect, что означает, что в игре есть два сеанса HTTP. Естественно, добавление атрибутов к одному не скажется на другом. Поэтому нет никакого способа «исправить» этот подход как таковой; скорее, я должен думать о другом подходе, чтобы получить атрибуты из Контроллера на страницу в другом домене, но не делать это через параметры URL-запроса ... –

ответ

1

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

псевдокод:

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