java - 如何使用 session_id 进行 REST 调用?
问题描述
我正在对服务进行多次服务调用。假设我必须对服务进行 10 次 POST 调用。每个服务都需要 session_id cookie。如果未提供,则服务将生成一个并将其用于所有服务调用。
在我的应用程序中,我进行了几次连续的服务调用。我可以在“循环”中再次调用这些调用,但我需要一个不同的 session_id 来进行单次迭代。
在代码中 MyService 组件正在进行服务调用。该服务的过滤器将生成 session_id。但是 invoke() 方法可能会被多次调用,我希望过滤器为每次调用 invoke() 方法生成不同的 session_id。目前, 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。但我不确定这种方法是否是实现这一目标的正确方法。
你能建议我使用什么?
解决方案
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>
推荐阅读
- powershell - 如何在 Azure Devops 的任务中运行带参数的 exe?
- ios - 将 BGRA 帧转换为 i420 或 Rgba ios Swift , objc
- php - 注意:未初始化的字符串偏移量:-1
- html - 下载时设置文件的到期时间
- r - 无法在 R 中拆分数据
- kotlin - 如何解决kotlin中的标签冲突?
- java - 需要检查 ArrayList 中的最后一个数字是否在 ArrayList 的其他部分重复
- php - CraftCMS 后端形成空白问题
- javascript - ReactJS:SetState 似乎没有触发
- python - 基于多列值的Python pandas groupby值