package com.ccc.cn.work.app;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.MessageFormat;
import javax.servlet.http.HttpServletResponse;
import com.ccc.cn.work.core.utils.WebImpUtils;
import com.ccc.cn.work.service.bbs.Base64;
import com.ccc.cn.work.service.bbs.BbsUser;
/**
*
************************************************
* @file: BBsUtils.java
* @Copyright: 2012 Yiwu China Commodity City Information Technology Co., Ltd.
* All right reserved.
************************************************
* @package: com.ccc.cn.work.service.bbs
* @class: BBsUtils
* @description:
*
* @author: bukebuhao
* @since: 2012-7-27-上午09:25:27
* @history:
*
*/
public class BBsUtils {
/**
* config/config_global.php
*/
private static String BBS_AUTH_KEY = ""; //$_config[ 'security' ][' authkey' ]
private static String COOKIE_PRE = ""; //$_config[ 'cookie'][ 'cookiepre' ]
private static String COOKIE_DOMAIN = ".xxx.com";//一级域名
private static String COOKIE_PATH = "/";
static {
COOKIE_PRE = COOKIE_PRE
+ BBsUtils.md5(COOKIE_PATH + "|" + COOKIE_DOMAIN).substring(0,
4) + "_";
}
public static String urlencode(String value) {
try {
return URLEncoder.encode(value, "GBK");
} catch (UnsupportedEncodingException e) {
return e.getMessage();
}
}
public static String md5(String input) {
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
return byte2hex(md.digest(input.getBytes()));
}
public static String md5(long input) {
return md5(String.valueOf(input));
}
public static String base64_decode(String input) {
try {
return new String(Base64.decode(input.toCharArray()), "iso-8859-1");
} catch (Exception e) {
return e.getMessage();
}
}
public static String base64_encode(String input) {
try {
return new String(Base64.encode(input.getBytes("iso-8859-1")));
} catch (Exception e) {
return e.getMessage();
}
}
public static String byte2hex(byte[] b) {
StringBuffer hs = new StringBuffer();
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs.append("0").append(stmp);
else
hs.append(stmp);
}
return hs.toString();
}
public static String substr(String input, int begin, int length) {
return input.substring(begin, begin + length);
}
public static String substr(String input, int begin) {
if (begin > 0) {
return input.substring(begin);
} else {
return input.substring(input.length() + begin);
}
}
public static long microtime() {
return System.currentTimeMillis();
}
public static long time() {
return System.currentTimeMillis() / 1000;
}
public static String sprintf(String format, long input) {
String temp = "0000000000" + input;
return temp.substring(temp.length() - 10);
}
/**
* 字符串加密以及解密函数
*
* @param string
* string 原文或者密文
* @param string
* operation 操作(ENCODE | DECODE), 默认为 DECODE
* @param string
* key 密钥
* @param int expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效
* @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
*
* @example
*
* a = authcode('abc', 'ENCODE', 'key'); b = authcode(a, 'DECODE',
* 'key'); // b(abc)
*
* a = authcode('abc', 'ENCODE', 'key', 3600); b = authcode('abc',
* 'DECODE', 'key'); // 在一个小时内,b(abc),否则 b 为空
*/
public static String uc_authcode(String string, String operation) {
return uc_authcode(string, operation, null);
}
public static String uc_authcode(String string, String operation, String key) {
return uc_authcode(string, operation, key, 0);
}
public static String uc_authcode(String string, String operation,
String key, int expiry) {
int ckey_length = 4; // note 随机密钥长度 取值 0-32;
// note 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
// note 取值越大,密文变动规律越大,密文变化 = 16 的 ckey_length 次方
// note 当此值为 0 时,则不产生随机密钥
// key = md5( key!=null ? key : UC_KEY);
key = md5(key);
String keya = md5(substr(key, 0, 16));
String keyb = md5(substr(key, 16, 16));
String keyc = ckey_length > 0 ? (operation.equals("DECODE") ? substr(
string, 0, ckey_length)
: substr(md5(microtime()), -ckey_length)) : "";
String cryptkey = keya + md5(keya + keyc);
int key_length = cryptkey.length();
string = operation.equals("DECODE") ? base64_decode(substr(string,
ckey_length)) : sprintf("%010d", expiry > 0 ? expiry + time()
: 0)
+ substr(md5(string + keyb), 0, 16) + string;
int string_length = string.length();
StringBuffer result1 = new StringBuffer();
int[] box = new int[256];
for (int i = 0; i < 256; i++) {
box[i] = i;
}
int[] rndkey = new int[256];
for (int i = 0; i <= 255; i++) {
rndkey[i] = (int) cryptkey.charAt(i % key_length);
}
int j = 0;
for (int i = 0; i < 256; i++) {
j = (j + box[i] + rndkey[i]) % 256;
int tmp = box[i];
box[i] = box[j];
box[j] = tmp;
}
j = 0;
int a = 0;
for (int i = 0; i < string_length; i++) {
a = (a + 1) % 256;
j = (j + box[a]) % 256;
int tmp = box[a];
box[a] = box[j];
box[j] = tmp;
result1
.append((char) (((int) string.charAt(i)) ^ (box[(box[a] + box[j]) % 256])));
}
if (operation.equals("DECODE")) {
String result = result1.substring(0, result1.length());
if ((Integer.parseInt(substr(result.toString(), 0, 10)) == 0 || Long
.parseLong(substr(result.toString(), 0, 10))
- time() > 0)
&& substr(result.toString(), 10, 16).equals(
substr(md5(substr(result.toString(), 26) + keyb),
0, 16))) {
return substr(result.toString(), 26);
} else {
return "";
}
} else {
return keyc + base64_encode(result1.toString()).replaceAll("=", "");
}
}
/**
*
* @description setBbsUserCookie(这里用一句话描述这个方法的作用)
* @conditions (这里描述这个方法适用条件 – 可选)
* @param response
* @param user
* void
* @exception
* @since 1.0.0
*/
public static void setBbsUserCookie(HttpServletResponse response,
BbsUser user) {
String saltkey = WebImpUtils.getRandomString(8);
String cookieInfo = MessageFormat.format("{0}\t{1}",
user.getPassword(), String.valueOf(user.getUid()));
String auth = BBsUtils.urlencode(BBsUtils.uc_authcode(cookieInfo,
"ENCODE", BBsUtils.md5(BBS_AUTH_KEY + saltkey)));
WebImpUtils.setUserCookie(response, COOKIE_PRE + "auth", auth,
COOKIE_DOMAIN);
WebImpUtils.setUserCookie(response, COOKIE_PRE + "saltkey", saltkey,
COOKIE_DOMAIN);
}
/**
*
* @description clearBbsUserCookie(这里用一句话描述这个方法的作用)
* @conditions (这里描述这个方法适用条件 – 可选)
* @param response
* void
* @exception
* @since 1.0.0
*/
public static void clearBbsUserCookie(HttpServletResponse response) {
WebImpUtils.removeCookie(response, COOKIE_PRE + "auth", COOKIE_DOMAIN);
WebImpUtils.removeCookie(response, COOKIE_PRE + "saltkey",
COOKIE_DOMAIN);
}
}
至于其中用到的WebImpUtils自己参考实现就可了,很简单的,例如继承org.springframework.web.util.WebUtils.
相关推荐
(社区论坛系统)、SupeSite(门户CMS系统)、X-Space(博客系统)从用户资源层面进行无缝整合,使得账号实现统一管理,在任何一个系统中进行注册、登录、注销等操作时,该账号在其他系统中的会话状态也将同步更新,...
因此,"最完美的Discuz UCenter的JAVA API接口【java包】"的出现解决了这一困境,使得 Java 应用程序也能无缝地与 Discuz! UCenter 进行交互。 这个 Java 开发包(dzclient4j)提供了必要的工具和类库,让 Java ...
通过这些接口,开发者可以轻松地在Java应用中创建用户账号、管理用户权限,以及同步用户的论坛活动。 项目的描述中提到,长期以来Java开发者面临的一个问题就是缺乏与PHP社区系统(如Discuz!)的集成工具。由于许多...
社区平台设计的Java实现的Ucenter API接口,它旨在帮助开发者在Java环境中与Discuz! Ucenter进行无缝对接,实现单点登录(Single Sign-On, SSO)功能。Ucenter是Discuz!提供的一种用户中心服务,它能够统一管理多个...
【JAVA_UCenter】是专为Java开发者设计的一个组件,它实现了与Discuz! UCenter的接口对接,使得Java应用程序能够无缝地与Discuz! 社区平台进行用户身份同步、数据交互等功能。Discuz! UCenter是知名的社区论坛系统...
2. **数据同步**:客户端需要定期与服务器同步论坛数据,包括新帖子、回帖、用户信息等,确保信息的实时性。 3. **离线阅读**:为了提供良好的用户体验,客户端应支持离线缓存,使用户在无网络环境下也能查看已加载...
的API,游戏可能能与论坛无缝集成,比如用户可以直接用论坛账号登录,游戏成就可以同步到论坛,增加社区互动。 6. **配置文件**:包含游戏设置,如难度级别、积分规则等,方便调整游戏参数。 7. **测试与调试**:...
5. 完成安装后,通过UCenter管理后台可以添加、管理各个社区应用,实现用户数据同步。 UCenter15_install.swf可能是一个Flash动画教程,用于更直观地展示安装过程。观看这个教程可以帮助用户更好地理解安装步骤和...
、PHPWind等论坛系统,允许用户注册账号、发布话题、回帖讨论,提供咨询服务,分享手术经历,以及对医院服务的评价。 4. **用户管理系统**:网站可能有用户注册、登录、个人信息管理等功能,方便医院管理员监控用户...