如何解码base64字符串在使用之前在 Camel 上下文中?

4xrmg8kj  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(131)

我在我的Camel Context中使用了一个bean,类为org.apache.commons.configuration.DatabaseConfiguration,以键-值的形式获取保存在我的DB中的属性。因此,这些值来自base64,我需要对这些值进行解码,以便在我的路由中使用它们。我该怎么做呢?

ldioqlga

ldioqlga1#

就像Ocp和Kubernetes工具在里面做的一样。它通过解码编码文本被传输到应用程序。你仍然可以在camel中做这个。这个例子是关于使用camel书中的jasypt库加密和解密的。你必须为base64实现一个基本的PropertiesParser.class。PropertiesParser是一个基本的a接口。完整的例子https://github.com/camelinaction/camelinaction2/blob/master/chapter14/configuration/src/test/java/camelinaction/SecuringConfigTest.java

JasyptPropertiesParser jasypt = new JasyptPropertiesParser();
    // and set the master password
    jasypt.setPassword("supersecret");   

    // we can avoid keeping the master password in plaintext in the application
    // by referencing a environment variable
    // export CAMEL_ENCRYPTION_PASSWORD=supersecret
    // jasypt.setPassword("sysenv:CAMEL_ENCRYPTION_PASSWORD");

    // setup the properties component to use the production file
    PropertiesComponent prop = context.getComponent("properties", PropertiesComponent.class);
    prop.setLocation("classpath:rider-test.properties");

    // and use the jasypt properties parser so we can decrypt values
    prop.setPropertiesParser(jasypt);

    return context;
7fhtutme

7fhtutme2#

您可以尝试使用java.util包中的Base64解码器,并将其与Bean、交换函数或处理器一起使用。使用Base64.getDecoder()Base64.getUrlDecoder()获取解码器,然后使用解码器将Base64字符串解码为字节数组,然后可以使用camels .convertBodyTo(String.class)将其转换为字符串,或者仅使用new String(bytes, StandardCharsets.UTF_8);创建新示例

package com.example;

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Base64.Decoder;

import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

public class Base64tests extends CamelTestSupport {

    @Test
    public void Test() throws Exception {

        MockEndpoint resultMockEndpoint = getMockEndpoint("mock:result");
        resultMockEndpoint.expectedMessageCount(1);
        resultMockEndpoint.message(0).body().isEqualTo("Hello World");

        template.sendBody("direct:decodeBase64", "SGVsbG8gV29ybGQ=");

        resultMockEndpoint.assertIsSatisfied();
    }

    @Override
    protected RoutesBuilder createRouteBuilder() throws Exception {

        return new RouteBuilder(){

            @Override
            public void configure() throws Exception {

                from("direct:decodeBase64")
                    .routeId("decodeBase64")
                    .bean(new Base64Decoder())
                    .log("${body}")
                    .convertBodyTo(String.class)
                    .to("mock:result");
            }
        };
    }
}

class Base64Decoder{

    public byte[] decode(String encodedValue){

        return Base64.getDecoder().decode(encodedValue);
    }
}

使用交换功能:

.setBody().exchange( e -> { 

    String encodedBody = e.getMessage()
        .getBody(String.class);

    return  Base64.getDecoder()
        .decode(encodedBody); 
})

相关问题