這幾天研究了下基于java+jsp開(kāi)發(fā)的網(wǎng)站同phpwind論壇的同步登陸問(wèn)題。主要就是要做到cookie的一致。
phpwind的cookie的生成方式較為復(fù)雜,而且查閱了網(wǎng)上很多資料,參照了phpwind包login.php里的過(guò)程,只是php語(yǔ)言的,對(duì)我這樣不熟悉php的人來(lái)說(shuō)還是有點(diǎn)麻煩的。于是我用java代碼實(shí)現(xiàn)生成了phpwind可以識(shí)別的cookie,做到了同步登陸。
具體步驟如下:
生成的cookie的name和value都要與phpwind的一致。
首先看cookie的name生成規(guī)則:先查找phpwind數(shù)據(jù)庫(kù)表pw_config的name為db_sitehash字段的值(這里用PwConfig.db_sitehash表示),經(jīng)過(guò)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) {
- //獲取系統(tǒng)瀏覽器信息,后面用到
- String user_Agent = request.getHeader("user-agent");
- Integer pwMember_Uid = null;
- //獲取jsp網(wǎng)站登錄用戶在論壇用戶表中的uid,當(dāng)然要同步登錄,jsp網(wǎng)站和論壇的數(shù)據(jù)庫(kù)用戶數(shù)據(jù)表數(shù)據(jù)肯定要一致啦
- pwMember_Uid = pwMembersDao.getuIdByUsername(user.getName());
- //為了效率,字符串拼接操作都采用StringBuilder類型
- StringBuilder cookieBaseStringBuilder = new StringBuilder();
- if (pwMember_Uid != null) {
- //這里的md5.hash()函數(shù)作用是對(duì)字符串進(jìn)行MD5方式加密,返回32位結(jié)果字符串;user是jsp網(wǎng)站登錄的用戶對(duì)象,里面的密碼就是明文,PwConfig.db_hash是論壇pw_config表中db_hash的值
- cookieBaseStringBuilder
- .append(pwMember_Uid.toString())
- .append("/t")
- .append(md5.hash(new StringBuilder(user_Agent)
- .append(md5.hash(user.getPassword()))
- .append(PwConfig.db_hash).toString()))
- .append("/t").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;
- //對(duì)前面生成的cookieBaseString和cookieBaseKey字符串中指定位字符進(jìn)行按位異或
- cookieValueStringBuilder
- .append((char) (cookieBaseString
- .toCharArray()[i] ^ cookieBaseKey.toCharArray()[k]));
- }
- String cookieValue = cookieValueStringBuilder.toString();
- try {
- //在進(jìn)行一次Base64編碼
- cookieValue = new String(Base64.encodeToByte(cookieValue
- .getBytes("UTF-8")));
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- //去掉base64編碼后末尾可能出現(xiàn)的等號(hào),好像不去也行,好像phpwind識(shí)別時(shí)也會(huì)自動(dòng)去掉
- 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);
- }
|
新聞熱點(diǎn)
疑難解答
圖片精選