如何将session_id用于REST调用?

时间:2019-01-09 22:51:10

标签: java spring spring-security resttemplate sessionid

我正在对一个服务进行多个服务调用。假设我必须对服务进行10次POST调用。 每个服务都需要session_id cookie。如果未提供,则该服务将生成一个并将其用于所有服务调用。

在我的应用中,我连续拨打了多个服务电话。我可以在“循环”中再次调用这些调用,但是单次迭代需要使用不同的session_id。

在代码中,MyService组件正在进行服务调用。 该服务的过滤器将生成session_id。 但是invoke()方法可能被多次调用,并且 我希望过滤器为每次调用生成一个不同的session_id invoke()方法。 当前,session_id生成一次

@Component
class MyService {
    @Autowired
    private RestTemplate restTemplate;

    /**
     * T - is a request type
     * R - is a response class type
    */
    private <T,R> Optional<R> doPost(String url, T request, Class<R> responseType) {
        return Optional.ofNullable(restTemplate.postForObject(url, request, responseType));
    }

    public void invoke() {
         doPost("url1", someRequest1, SomeResponse1.class);
         doPost("url2", someRequest2, SomeResponse2.class);
    }
}

我可以在invoke()方法中创建一个session_id,并确保使用不同的session_id进行这些调用。 invoke()中的所有服务调用将具有相同的session_id,而下一次调用将具有不同的session_id。但是我不确定这种方法是否是实现此目标的正确方法。

您可以建议我使用什么?

1 个答案:

答案 0 :(得分:0)

session_id由每个客户端生成(如果您从其他Web浏览器进行测试,您将看到一个不同的session_id),则为每个请求接收不同值的唯一方法是使会话无效,如果您要求按请求提供uuid,则使用侦听器

public class ProjectRequestListener implements ServletRequestListener {    

 @Override
 public void requestInitialized(ServletRequestEvent requestEvent) {
     requestEvent.getServletRequest().setAttribute("requestId", UUID.randomUUID());
 }

 @Override
 public void requestDestroyed(ServletRequestEvent requestEvent) {
    requestEvent.getServletRequest().setAttribute("requestId", null);
 }
}

并将侦听器添加到项目web.xml

<listener>
    <listener-class>
    com.project.server.ProjectRequestListener
    </listener-class>
</listener>