2014-06-10 30 views
1

我正在使用Spring 3.2.4和Spring Security 3.2.3來處理RESTful API調用以返回令牌的「獲取安全令牌」請求(這將用於保護對服務的後續請求)。這是具有主體具有用戶名和密碼,並在所述控制器被處理的POST請求:所述控制器已成功完成處理請求Spring 3.2 REST API添加cookie到控制器外的響應

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public SessionTokenResponse getSessionToken(@RequestBody Credentials credentials, ModelAndView interceptorModel) throws AccessException { 
    final String token = webGate.getSessionTokenForUser(credentials.getUsername(), credentials.getPassword()); 
    LOGGER.debug("Logged in user : " + credentials.getUsername()); 

    interceptorModel.addObject(SessionConstants.INTERCEPTOR_MODEL_TOKEN_KEY, token); // Used by post-processing in interceptors, e.g. add Cookie 

    return new SessionTokenResponse(ResponseMessages.SUCCESS, token); 
} 

後,我想增加一個cookie與令牌到響應。 我試過HandlerInterceptorAdapter實現,但我不能找到辦法的應答中的「令牌」或ModelAndView的:

@Override 
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView interceptorModel) throws Exception { 
    final String token = (String) interceptorModel.getModel().get(SessionConstants.INTERCEPTOR_MODEL_TOKEN_KEY); 

    if (token != null) { 
     final Cookie obsso = new Cookie(cookieName, token); 
     obsso.setPath(cookiePathUri); 
     obsso.setDomain(cookieDomain); 
     obsso.setMaxAge(cookieMaxAge); 

     response.addCookie(obsso); 
    } 
} 

的interceptorModel是。 由於@ResponseBody已經解決了,並且不再需要ModelAndView(這只是我基於調試的假設),Spring MVC似乎並沒有將它提供給postHandle。

在攔截器或監聽器的控制器之外實現該功能(在響應中添加cookie)的正確方法是什麼?

+0

此外,由於您正在擴展'HandlerInterceptorAdapter',postHandle方法將僅具有請求,響應和對象參數。不幸的是,你不能在Spring上添加另一個參數來填充。但我似乎記得找到了從'HttpServletRequest'或'HttpServletResponse'對象中獲取'ModelAndView'對象的方法。我只是不記得如何。 – JamesENL

回答

1

要檢索令牌可以使用請求對象

request.setAttribute(SessionConstants.INTERCEPTOR_MODEL_TOKEN_KEY, token); 

,然後在的postHandle

String token = (String) request.getAttribute(SessionConstants.INTERCEPTOR_MODEL_TOKEN_KEY); 

不過,我不認爲你可以在一個cookie添加到響應對象postHandle作爲響應已經提交。

也許您可以將標記信息存儲在servlet上下文中。

在您的控制器中,將令牌信息添加到servlet上下文中。
然後執行preHandle,以便每個api調用都可以檢查該用戶的標記是否存在於servlet上下文中,如果可以的話,您可以將cookie添加到響應中。