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
相关产品推荐
相关产品推荐

