jsp網(wǎng)站到phpwind論壇的同步登陸登出實(shí)現(xiàn)
2016-07-20 08:17:09
14191
討論下基于java+jsp開發(fā)的網(wǎng)站同phpwind論壇的同步登陸問題,主要就是要做到cookie的一致。
phpwind的cookie的生成方式較為復(fù)雜,而且查閱了網(wǎng)上很多資料,參照了phpwind包login.php里的過程,只是php語言的,對我這樣不熟悉php的人來說還是有點(diǎn)麻煩的。于是我用java代碼實(shí)現(xiàn)生成了phpwind可以識別的cookie,做到了同步登陸。
具體步驟如下:
生成的cookie的name和value都要與phpwind的一致,首先看cookie的name生成規(guī)則,先查找phpwind數(shù)據(jù)庫表pw_config的name為db_sitehash字段的值(這里用PwConfig.db_sitehash表示),經(jīng)過MD5方式加密后,取前5位與字符串"_winduser"拼接而成。
java代碼如下:
private String generateCookieName() {
StringBuilder cookieNameString = new StringBuilder(md5.hash(
PwConfig.db_sitehash).substring(0, 5)).append("_winduser");
return cookieNameString .toString();
}
再看cookie的value生成規(guī)則,有點(diǎn)復(fù)雜,需要細(xì)心和一點(diǎn)耐心,需要獲取
private String generateCookieValue(User user, HttpServletRequest request,
HttpServletResponse response) {
String user_Agent = request.getHeader("user-agent");
Integer pwMember_Uid = null;
pwMember_Uid = pwMembersDao.getuIdByUsername(user.getName());
StringBuilder cookieBaseStringBuilder = new StringBuilder();
if (pwMember_Uid != null) {
cookieBaseStringBuilder
.append(pwMember_Uid.toString())
.append(" ")
.append(md5.hash(new StringBuilder(user_Agent)
.append(md5.hash(user.getPassword()))
.append(PwConfig.db_hash).toString()))
.append(" ").append("");
} else {
return "";
}
String cookieBaseKey = md5.hash(
new StringBuilder(user_Agent).append(PwConfig.db_hash)
.toString()).substring(8, 26);
String cookieBaseString = cookieBaseStringBuilder.toString();
int keylen = cookieBaseKey.length();
int strlen = cookieBaseString.length();
StringBuilder cookieValueStringBuilder = new StringBuilder();
for (int i = 0; i < strlen; i++) {
int k = i % keylen;
cookieValueStringBuilder
.append((char) (cookieBaseString
.toCharArray()[i] ^ cookieBaseKey.toCharArray()[k]));
}
String cookieValue = cookieValueStringBuilder.toString();
try {
cookieValue = new String(Base64.encodeToByte(cookieValue
.getBytes("UTF-8")));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
cookieValue = cookieValue.replace("=", "");
return cookieValue;
}
至此,cookie的name和value都已經(jīng)生成,只需要放到cookie中就行了.
public void addCookie(User user, HttpServletRequest request,
HttpServletResponse response) {
String name = generateCookieName();
String value = generateCookieValue(user, request, response);
Cookie cookie = new Cookie(name , value);
cookie.setMaxAge(60 * 30);
cookie.setPath("/");
response.addCookie(cookie);
}
同步登出也很容易,只要將指定name值的cookie的value設(shè)置為空就行了
public void clearCookie(HttpServletResponse response) {
Cookie cookie = new Cookie(getCookieName(), null);
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
}