近一段项目想用sso,解决方案想到了ucenter,现成的东西拿来就可以用,何乐而不为,因为自身业务系统有java,有php,有.net。急寻java的api,于是在网上找到了discuz-ucenter-api-for-java,下下来试用了一下,确实不错,但中文完全不支持……然后查看源码,一看就知道作者是纯php程序员……php好像对编码格式的处理不是很规范。看到很多网友也反映这个问题,带着问题,一步步debug,调用自带的Jsp_demo.jsp,发现每次打出来的用户名后面都有个]>,瞬间想到了是不是xml解析的时候有误,于是把result打出来,果不其然,因为调用ucenter接口返回的xml是iso-8859-1的预编码,作者用jdk自带的dom解析把中文解析出一串乱码,其中把cdata的结束符]>也带进去了,找到原因了就动手。
1、传值,登录是调用uc.uc_user_login("username", "password");这个方法最终post到ucenter还用了uriencode,可以打开PHPFunctions.java,就第一个方法23行,直接改成:
protected String urlencode(String value){
String str = null;
try
{
str = URLEncoder.encode(value,"UTF-8");
}
catch (UnsupportedEncodingException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
2、返回值字符串解析编码,作者用的把InputStreamReader,很显然没有作编码处理,打开Client.java,找到uc_fopen方法,第344行,改成:
BufferedReader reader = new BufferedReader(new InputStreamReader(ins,"UTF-8"));
这里两步我的编码是UTF-8,请根据自己的需要改成自己对应的编码格式。一般要么是UTF-8,要么是GBK