【问题标题】:Session Scope in Restful Spring ServicesRestful Spring Services 中的 Session 范围
【发布时间】:2015-11-24 18:16:47
【问题描述】:

此问题与this 有关。我有一个 Restful 服务,它以异步方式调用许多 web 服务(使用线程 - 触发并忘记)。我将我的服务收到的请求标头传递给这些 Web 服务。但是,由于这些请求是以异步方式触发的,因此这些请求通常在我的 REST 服务返回响应后执行。这会导致 HTTP 请求对象丢失。因此,正如该线程中所建议的,我正在使用会话范围来保留请求标头。这是否会产生我应该分析的任何不利影响。有没有更好的方法我必须看看?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    如果您开始使用会话范围来存储请求,您的服务就不再是 RESTful,因为它不是无状态的。我建议完全避免使用会话范围。

    如果需要在异步线程中使用请求对象(使用Spring的@Async注解),只需通过参数将其传递给异步逻辑即可。

    类似这样的:

    @Component
    public class AsyncUserService {
    
      @Async("customTaskExecutor")
      public void updateOrAddUser(int id, HttpServletRequest request) throws {
        //do your stuff
      }
    }
    
    @Controller
    @RequestMapping("/users")
    public class UserController {
      private final AsyncUserService userService;
    
      @Autowired
      public UserController(AsyncUserService userService) {
        super();
        this.userService = userService;
      }
    
      @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
      @ResponseStatus(HttpStatus.OK)
      public void putUser(@PathVariable("id") int identifier, HttpServletRequest request) {
        userService.updateOrAddUser(identifier, request);
      }
    }
    

    【讨论】:

    • 感谢 luboskrnac,我确实使用了异步注释来触发异步请求,但是请求上下文在拦截后端调用的拦截器中丢失了。我再试一次
    • 我对此还有另一个问题。在这种情况下,我使用会话范围的 bean 仅保留异步调用的值,而不使用它来使服务有状态。请您帮忙解释一下这可能造成的不利影响?谢谢!
    • 在您的情况下,这可能不是问题,但是当您可以通过参数将请求传递给线程时使用会话范围对我来说根本没有意义。当我处理 REST 服务时,在代码审查期间,会话范围是一个大大的感叹号。
    猜你喜欢
    • 2011-11-27
    • 2019-01-11
    • 1970-01-01
    • 2017-07-08
    • 2011-11-03
    • 2017-05-13
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多