当前位置: 首页 > 知识库问答 >
问题:

Spring 3.2 REST API将cookie添加到外部控制器的响应中

翟志新
2023-03-14

我正在使用Spring 3.2.4和Spring Security 3.2.3来处理RESTful API调用,以返回令牌(将用于保护对服务的后续请求)的“Get Security token”请求。这是一个POST请求,它有一个带有用户名和密码的主体,并在控制器中处理:

@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为空。Spring MVC似乎没有将其提供给postHandle,因为@ResponseBody已经解析,不再需要ModelAndView(这只是我基于调试的假设)。

在拦截器或监听器中的控制器之外实现(将cookie添加到响应中)的正确方法是什么?

共有1个答案

岳永思
2023-03-14

若要检索令牌,可以使用request对象

 request.setAttribute(SessionConstants.INTERCEPTOR_MODEL_TOKEN_KEY, token);

然后在后处理中

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

但是,我不认为您可以在postHandle中向response对象添加cookie,因为响应已经提交了。

 类似资料:
  • 我有一个过滤器和一个Servlet。我试图创建一个Cookie,并将其添加到“chain.do过滤器”方法后的过滤器中的响应中。 *Cookie需要在"chain.do过滤器"方法之后创建并添加到响应中,因为它的值取决于来自响应的一些信息。 我做了一些研究,发现为响应创建一个包装器(在doFilter方法之前)将允许我实现这一点,但它不起作用,我可以将Cookie添加到包装器中,但在浏览器中检查时

  • 我非常确定“Expires”是有效的HTTP响应头类型。但是当我尝试在代码中设置它时:(这是在ActionFilter.OnActionExecuted方法中) 我最后有一个例外: InvalidOperationException:错误使用的标头名称。确保请求头与HttpRequestMessage一起使用,响应头与HttpResponseMessage一起使用,内容头与HttpContent对

  • 我通过使用承载令牌实现了对SpringBoot API的授权,当登录成功时,该令牌被添加到响应的“授权”头中,然后需要通过React项目的登录获取方法读取该令牌,并添加到后续请求的“授权”头中。 不幸的是,虽然我被告知这是不可能使用Fetch,所以我现在试图重构我的登录功能,以便它返回响应正文中的令牌,而不是标题。 我不知道如何做到这一点,目前没有返回JSON正文对象,只有标头,我将不得不更改我的

  • 问题内容: 我有一个Flask Web应用程序,它使用render_template如下,我需要在响应中添加一个Content-Security-Policy作为附加的HTTP响应标头。我尝试了以下方法,但都失败了,并给了我500。 1。 2。 这里有什么问题? 在终端上,以localhost:3001的身份访问Web应用程序时,我看到以下内容 127.0.0.1–[2015年4月6日01:45:

  • 我有一个示例项目,设置如下: 其中“测试项目”依赖于“测试库”,而最后一个依赖于“纯Java库”,编译该项目并启动此设置工作正常。 我现在正在考虑导入以前的Eclipse工作区,并与Android studio一起工作,问题是项目设置不同,我希望保持这种方式。 我尝试了很多配置,但没有找到一种方法来引用父文件夹范围之外的项目(在示例中为'root')。 在许多平台/模块中,您可以使用“..”但这对

  • 问题内容: 我想添加到我的反应组件 我知道我可以简单地使用JSX添加它,但我不知道如何使用它, 例如,此脚本具有一个称为A.Sort()的函数,如何调用它并从组件中使用它? 问题答案: 您可以异步加载脚本并在加载时访问它。 它应该附加到。 要么