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

WSO2 APIM 3.2.0类中介器与XML序列无法设置自定义响应码如何解决

WSO2 APIM 3.2.0 自定义校验返回401状态码方案

问题根因

你是在请求 mediation 流中做用户校验,仅设置HTTP_SC状态码属性无法生效的核心原因是:默认流程下引擎会继续向后执行请求转发逻辑,你使用的<send/>中介器未指定目标端点时,WSO2会默认返回202 Accepted标识请求已接收,没有显式触发「直接响应客户端、终止后续流程」的逻辑。

方案1:自定义XML序列实现(推荐)

校验不通过时使用<respond/>中介器直接返回响应,替换原有<send/>配置即可,完整配置如下:

<!-- 移除原有状态码属性 -->
<property action="remove" name="HTTP_SC" scope="axis2"/>
<!-- 设置401状态码,需指定类型为INTEGER -->
<property name="HTTP_SC" scope="axis2" value="401" type="INTEGER"/>
<!-- 可选配置:设置响应头与自定义错误响应体 -->
<property name="ContentType" value="application/json" scope="axis2"/>
<payloadFactory media-type="json">
    <format>{"error_code": "401", "error_msg": "用户身份校验不通过"}</format>
    <args/>
</payloadFactory>
<!-- 核心配置:直接将当前上下文作为响应返回给客户端,终止后续流程,不会转发到后端 -->
<respond/>

方案2:Java类中介器实现

Java代码中除了设置状态码,还需要返回false终止后续中介器执行,再配合序列中的<respond/>即可生效,代码示例如下:

import org.apache.synapse.MessageContext;
import org.apache.synapse.core.axis2.Axis2MessageContext;
import org.apache.synapse.mediators.AbstractMediator;
import org.apache.axis2.context.MessageContext;

public class UserAuthMediator extends AbstractMediator {
    @Override
    public boolean mediate(MessageContext mc) {
        // 执行你的用户身份校验逻辑
        boolean userValid = yourValidateLogic(mc);
        if (!userValid) {
            MessageContext axis2Ctx = ((Axis2MessageContext) mc).getAxis2MessageContext();
            // 移除原有状态码
            axis2Ctx.removeProperty("HTTP_SC");
            // 传入Integer类型的401状态码
            axis2Ctx.setProperty("HTTP_SC", 401);
            // 可选配置:设置响应内容类型
            axis2Ctx.setProperty("ContentType", "application/json");
            // 标识为响应消息
            mc.setProperty("RESPONSE", "true");
            // 返回false终止后续中介流程
            return false;
        }
        // 校验通过返回true,继续执行后续请求转发逻辑
        return true;
    }

    private boolean yourValidateLogic(MessageContext mc) {
        // 自定义校验逻辑实现
        return false;
    }
}

调用Java中介器的XML序列配置示例:

<class name="com.yourpackage.UserAuthMediator"/>
<!-- 判断校验结果,若失败直接响应 -->
<filter source="get-property('RESPONSE')" regex="true">
    <then>
        <respond/>
    </then>
</filter>

注意事项

  • HTTP_SC属性必须传入Integer类型,字符串类型的"401"不会生效
  • 禁止使用<send/>返回错误响应,必须用<respond/>触达客户端

内容的提问来源于stack exchange,提问作者nivedhav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:24:01