tomcat / spring引导会话ID中永远不会包含哪些字符?

时间:2016-02-06 01:36:50

标签: java spring tomcat

在Spring Boot应用程序中,我想从一个REST服务传递一个组合变量,通过用户界面传递,然后再传回第二个REST服务。为了实现这一点,我希望第一个REST服务通过将会话ID与表示其他内容的不同字符串连接来创建一个单独的字符串,并使用分隔符值标记两个字符串之间的中断,以便String combined = sessionid+separatorcharacter+someotherstring。为此,第二个REST服务将接受组合字符串作为@RequestParam,然后将字符串分解为会话ID和另一个值。

我将使用String.split()使用分隔符值来分割组合字符串的两个部分,例如:

String[] parts = string.split("separatorcharacter");
String sessionid = parts[0];
String someotherstring = parts[1];

在创建分隔字符串两部分的标记时,我可以选择哪些字符?组合字符串将用作URL参数,因此必须能够跨越互联网在http请求中,也永远不会出现在Spring或tomcat生成的任何会话ID中。此外,其中一个字符串将采用Base64编码,因此分隔符需要在编码/解码过程中存活。 我会在分割前进行解码,因此我们无需担心编码时使用的字符。

但是,如果重要,编码/解码是:

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class StringUtil {

    private static Random random = new Random((new Date()).getTime());

    public static String encrypt(String userId) {  
        BASE64Encoder encoder = new BASE64Encoder();
        byte[] salt = new byte[8];
        random.nextBytes(salt);
        return encoder.encode(salt)+encoder.encode(userId.getBytes());
    }

    public static String decrypt(String encryptKey) {
        if (encryptKey.length() > 12) {
            String cipher = encryptKey.substring(12);
            BASE64Decoder decoder = new BASE64Decoder();
            try {
                return new String(decoder.decodeBuffer(cipher));
            } catch (IOException e) {}
        }         
    return null;
    }
}

0 个答案:

没有答案