后台是通过JWT创建、解析token的,登陆接口给前端返回token后前端需要解析其中payload段的参数。
前端采用这段代码解析的时候编译没问题,运行时出现异常:
查阅博客之后发现是Android的FrameWork层和JWT之间jar包冲突,详情见博客:
Android中使用commons-codec-1.6.jar 进行Base64编解码出现的问题
https://www.cnblogs.com/jooy/p/9146527.html
上文中提供了解决方案,但好像比较复杂,由于我们前端只是用来解析token第二段payload中的属性,本质就是对字符串Base64解码再按照UTF-8重新编码,干脆手写一个解析方法给前端用,不用JWT的封装了。
Java 8的java.util套件中,新增了Base64的类别,可以用来处理Base64的编码与解码
(这应该不会冲突了吧?)
import java.io.UnsupportedEncodingException;
import java.util.Base64;
public class ParseTokenUtil {
// 使用示例:
// Long userId = parseToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTI4Mjk5MTYsInVzZXJJZCI6MTN9.Qx7_BrfaISKR7XYoStmQCU4JKa13tqLz5VJ_oZ_Tvtk"
// ,"userId",Long.class);
public static <T> T parseToken(String token, String key, Class<T> clazz) {
//将token分成三部分
String[] split = token.split("\\.");
//第二部分是payload
String params = split[1];
Base64.Decoder decoder = Base64.getDecoder();
String string = "";
try {
string = new String(decoder.decode(params), "UTF-8");
JSONObject jsonObject = JSON.parseObject(string);
T object = jsonObject.getObject(key, clazz);
return object;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
}
卧槽还真的不行
在stackoverflow上找到答案:
修改安卓项目中该工具类的导包和decode方法调用:
import java.io.UnsupportedEncodingException;
import android.util.Base64;
public class ParseTokenUtil {
// 使用示例:
// Long userId = parseToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTI4Mjk5MTYsInVzZXJJZCI6MTN9.Qx7_BrfaISKR7XYoStmQCU4JKa13tqLz5VJ_oZ_Tvtk"
// ,"userId",Long.class);
public static <T> T parseToken(String token, String key, Class<T> clazz) {
//将token分成三部分
String[] split = token.split("\\.");
//第二部分是payload
String params = split[1];
String string = "";
try {
string = new String(Base64.decode(params,Base64.DEFAULT), "UTF-8");
JSONObject jsonObject = JSON.parseObject(string);
T object = jsonObject.getObject(key, clazz);
return object;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
}
完美解决!