首页 > CMS > Phpwind > 正文

jsp网站到phpwind论坛的同步登陆登出实现

2024-08-30 19:06:58
字体:
来源:转载
供稿:网友

这几天研究了下基于java+jsp开发的网站同phpwind论坛的同步登陆问题。主要就是要做到cookie的一致。

phpwind的cookie的生成方式较为复杂,而且查阅了网上很多资料,参照了phpwind包login.php里的过程,只是php语言的,对我这样不熟悉php的人来说还是有点麻烦的。于是我用java代码实现生成了phpwind可以识别的cookie,做到了同步登陆。

具体步骤如下:

生成的cookie的name和value都要与phpwind的一致。

首先看cookie的name生成规则:先查找phpwind数据库表pw_config的name为db_sitehash字段的值(这里用PwConfig.db_sitehash表示),经过MD5方式加密后,取前5位与字符串"_winduser"拼接而成。

java代码如下:

  1. private String generateCookieName() {  
  2.        StringBuilder cookieNameString = new StringBuilder(md5.hash(  
  3.        PwConfig.db_sitehash).substring(05)).append("_winduser");  
  4.        return cookieNameString .toString();  
  5.  } 

再看cookie的value生成规则,有点复杂,需要细心和一点耐心。需要获取

  1. private String generateCookieValue(User user, HttpServletRequest request,  
  2.    HttpServletResponse response) {  
  3. //获取系统浏览器信息,后面用到  
  4.   String user_Agent = request.getHeader("user-agent");  
  5.   Integer pwMember_Uid = null;  
  6.  //获取jsp网站登录用户在论坛用户表中的uid,当然要同步登录,jsp网站和论坛的数据库用户数据表数据肯定要一致啦  
  7.    pwMember_Uid = pwMembersDao.getuIdByUsername(user.getName());  
  8.    
  9. //为了效率,字符串拼接操作都采用StringBuilder类型  
  10.   StringBuilder cookieBaseStringBuilder = new StringBuilder();  
  11.   if (pwMember_Uid != null) {  
  12. //这里的md5.hash()函数作用是对字符串进行MD5方式加密,返回32位结果字符串;user是jsp网站登录的用户对象,里面的密码就是明文,PwConfig.db_hash是论坛pw_config表中db_hash的值  
  13. cookieBaseStringBuilder  
  14.      .append(pwMember_Uid.toString())  
  15.      .append("/t")  
  16.      .append(md5.hash(new StringBuilder(user_Agent)        
  17.        .append(md5.hash(user.getPassword()))  
  18.        .append(PwConfig.db_hash).toString()))  
  19.      .append("/t").append("");  
  20.   } else {  
  21.    return "";  
  22.   }  
  23.   String cookieBaseKey = md5.hash(  
  24.     new StringBuilder(user_Agent).append(PwConfig.db_hash)  
  25.       .toString()).substring(8, 26);  
  26.   String cookieBaseString = cookieBaseStringBuilder.toString();  
  27.   int keylen = cookieBaseKey.length();  
  28.   int strlen = cookieBaseString.length();  
  29.   StringBuilder cookieValueStringBuilder = new StringBuilder();  
  30.   for (int i = 0; i < strlen; i++) {  
  31.    int k = i % keylen;  
  32. //对前面生成的cookieBaseString和cookieBaseKey字符串中指定位字符进行按位异或  
  33.    cookieValueStringBuilder  
  34.      .append((char) (cookieBaseString  
  35.        .toCharArray()[i] ^ cookieBaseKey.toCharArray()[k]));  
  36.   }  
  37.   String cookieValue = cookieValueStringBuilder.toString();  
  38.   try {  
  39. //在进行一次Base64编码  
  40. cookieValue = new String(Base64.encodeToByte(cookieValue  
  41.      .getBytes("UTF-8")));  
  42.   } catch (UnsupportedEncodingException e) {  
  43.    e.printStackTrace();  
  44.   }  
  45. //去掉base64编码后末尾可能出现的等号,好像不去也行,好像phpwind识别时也会自动去掉  
  46.   cookieValue = cookieValue.replace("=""");  
  47.   return cookieValue;  
  48.  } 

 至此,cookie的name和value都已经生成,只需要放到cookie中就行了。

  1. public void addCookie(User user, HttpServletRequest request,  
  2.    HttpServletResponse response) {  
  3.   String name = generateCookieName();  
  4.   String value = generateCookieValue(user, request, response);  
  5.   Cookie cookie = new Cookie(name , value);  
  6.   cookie.setMaxAge(60 * 30);  
  7.   cookie.setPath("/");  
  8.   response.addCookie(cookie);  
  9.  } 

同步登出也很容易,只要将指定name值的cookie的value设置为空就行了

  1. public void clearCookie(HttpServletResponse response) {  
  2.   Cookie cookie = new Cookie(getCookieName(), null);  
  3.   cookie.setMaxAge(0);  
  4.   cookie.setPath("/");  
  5.   response.addCookie(cookie);  
  6.  } 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选