2014-06-10 25 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添加到响应中。