【问题标题】:is there a way to set response code/text from WSO2 custom handler?有没有办法从 WSO2 自定义处理程序设置响应代码/文本?
【发布时间】:2016-01-12 15:03:34
【问题描述】:

我根据用户指南中的说明为 WSO2 编写了一个自定义身份验证处理程序。

一般来说,处理程序工作正常,即,当提供正确的凭据时,它会正确运行 API,而当提供错误的凭据时,它会拒绝 API,但在这种情况下 - 状态代码 202 和空响应文本返回到“卷曲”。

有没有办法控制返回的响应代码或为这种情况构建合理的响应文本?每当自定义处理程序决定拒绝 API 调用时,我宁愿返回“禁止”的响应代码或“提供错误凭据”的文本。

我看到 HandleRequest(MessageContext messageContext) 返回布尔值,所以不知道如何发回所需的响应代码和文本。

【问题讨论】:

    标签: wso2 http-response-codes


    【解决方案1】:

    以下是为捕获请求而编写的示例代码,如果“授权”标头不可用,则将请求作为响应发送回客户端。

    您可以看到我添加了值为 401 的“HTTP_SC”标头。

    使用messageContext.setProperty("RESPONSE", "true");,我们可以将其作为响应发送回客户端。

     public boolean handleRequest(MessageContext messageContext) {
            org.apache.axis2.context.MessageContext axis2MessageContext = ((Axis2MessageContext) messageContext)
                    .getAxis2MessageContext();
            Object headers = axis2MessageContext
                    .getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
    
            try {
                if (headers != null && headers instanceof Map) {
                    Map headersMap = (Map) headers;
                    if (headersMap.get("Authorization") == null) {
                        headersMap.clear();
                        axis2MessageContext.setProperty("HTTP_SC", "401");
                        headersMap.put("WWW-Authenticate",
                                "Basic realm=\"WSO2 ESB\"");
                        axis2MessageContext.setProperty("NO_ENTITY_BODY",
                                new Boolean("true"));
                        messageContext.setProperty("RESPONSE", "true");
                        messageContext.setTo(null);
                        Axis2Sender.sendBack(messageContext);
                        return false;
    
                    } else {
    
                        return true;
                    }
                }
                return false;
    
            } catch (Exception e) {
                log.error("Unable to execute the authentication process : ", e);
                return false;
            }
    
        }
    

    希望这对您有所帮助。 干杯。

    【讨论】:

    • 非常感谢!我怀疑在你的代码中你的意思是“if (headersMap.get("Authorization") != null) { ... }”(而不是 '==')
    • Axis2Sender.sendBack(messageContext);将消息发送回客户端。 :)
    • 此代码用于检查传入请求是否使用基本身份验证进行保护。如果禁用基本身份验证,则请求作为响应发送回客户端。您可以根据需要更改逻辑。无论如何,使用“Axis2Sender.sendBack(messageContext);”你可以发回请求
    • 如果您认为这是您所期望的,请不要忘记接受它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多