You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RestAssured跨类使用SessionFilter调用Jira接口报无权限问题

问题根因

你遇到的跨类Session失效问题,核心是以下两个高频原因之一:

  • 类加载器隔离:如果你的运行环境开启了热部署(比如Spring Boot DevTools、IDEA的热更新、测试框架的类隔离配置),不同类会被不同的类加载器加载,Authenticator里的静态SessionFilter实例会被初始化多次,导致认证后存储的Cookie无法被其他类的方法读取。
  • 手动指定multipart请求头出错:你在上传附件的请求里手动加了header("Content-Type","multipart/form-data"),RestAssured会覆盖自动生成的带boundary参数的Content-Type,导致Jira无法正常解析请求体,误判身份信息无效(这个问题在单类运行时可能因为请求构建顺序偶然生效,但跨类时稳定性极差)。

修复方案

第一步:删除多余的Content-Type头

上传附件的请求中移除手动配置的multipart Content-Type,RestAssured会自动生成带正确boundary的请求头:

given().header("X-Atlassian-Token","no-check")
        // 删掉手动配置Content-Type的这行
        .multiPart("file",new File("src/test/java/Repo/jira"))
        .pathParam("id","10000")
        .filter(Authenticator.session)
        .when().post("/rest/api/2/issue/{id}/attachments")
        .then().log().all().extract().response().asString();

第二步:规避静态SessionFilter的类加载问题

如果修复第一步后依然报错,放弃使用静态SessionFilter,改用手动传递Cookie的方式,彻底避免实例隔离问题:

  1. 修改Authenticator类,直接返回有效的JSESSIONID:
public class Authenticator {
    public static String authenticate(){
        RestAssured.baseURI = "http://localhost:8080";
        SessionFilter session = new SessionFilter();
        given().header("Content-Type", "application/json")
                .filter(session)
                .body(JiraInputs.auth())
                .when().post("/rest/auth/1/session")
                .then().log().all().statusCode(200); // 增加状态码校验,确保认证成功
        return session.getSessionId();
    }
}
  1. 修改AddAttachment类,手动携带Cookie:
public class AddAttachment {
    public static void addAttachment(String sessionId){
        RestAssured.baseURI="http://localhost:8080";
        given().header("X-Atlassian-Token","no-check")
                .cookie("JSESSIONID", sessionId) // 手动传入认证后的sessionId
                .multiPart("file",new File("src/test/java/Repo/jira"))
                .pathParam("id","10000")
                .when().post("/rest/api/2/issue/{id}/attachments")
                .then().log().all().statusCode(201);
    }
}
  1. 调整main方法调用逻辑:
public class MainClass {
    public static void main(String[] args) {
        String sessionId = Authenticator.authenticate();
        AddAttachment.addAttachment(sessionId);
    }
}

验证步骤

运行代码前可以先确认两点:

  • 认证接口返回状态码为200,确保使用的账号确实有对应工单的附件上传权限
  • 打印传入上传请求的JSESSIONID和认证接口返回的sessionId完全一致

内容的提问来源于stack exchange,提问作者Ege İper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:54:06