作用:同步登录论坛,不用修改论坛代码
必须条件:网站与论坛必须在同一域名下,可以是不同二级域名;两边用户是一样的。
原理概述:网站登录成功后,POST提交账号密码到论坛,取得登录成功后返回的cookie,保存于一级域名下。
具体实现:
1.模拟登录获取cookie
用抓包工具(我用的是firefox的firebug)
打开firebug,登录论坛
可以看到,登录就是这个POST请求。
在firebug中可以看到请求地址,头信息和POST参数列表,然后模拟这个POST就行
2.保存cookie。保存cookie没什么好多说的,只说一点: 在二级域名下存cookie时,设置Domain属性为一级域名,会将cookie存于一级域名下,然后另外的二级域名可以访问此cookie。例如有 codingthink.com; bbs.codingthink.com;
v.codingthink.com三个域名。在bbs.codingthink.com中存了一个cookie,设置了Domain属性为 codingthink.com,那么v.codingthink.com就可以读取这个cookie。
代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net; using System.Text; using System.IO; /// <summary> /// 论坛工具类 /// </summary> public class DiscuzTools { private HttpContext context; //当前http上下文 private string username;//用户名 private string password;//密码 private string postdata;//提交数据 private string useragent;//浏览器信息 private const string POST = "POST"; //请求方式 private const string DOMAIN="http://localhost";//论坛所在域名 //请求地址 private const string POSTURL="/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1"; //post数据的字符串格式 private const string DATAFORMAT = "fastloginfield=username&username={0}&password={1}&quickforward=yes&handlekey=ls"; //提交数据类型 private const string CONTENTTYPE = "application/x-www-form-urlencoded"; //保存cookie的域名 private const string COOKIEDOMAIN = "localhost"; //保存cookie路径 private const string COOKIEPATH = "/"; /// <summary> /// 实例化discuztools类,用于同步登录 /// </summary> /// <param name="context"></param> /// <param name="postdata"></param> /// <param name="useragent"></param> public DiscuzTools(HttpContext context,string username,string password,string useragent) { this.context = context; this.postdata = string.Format(DATAFORMAT, HttpUtility.UrlEncode(username, Encoding.GetEncoding("gb2312")).ToUpper(), password); this.useragent = useragent; } /// <summary> /// 模拟登录论坛,获取cookie /// </summary> /// <returns></returns> private CookieCollection GetCookies() { try { HttpWebRequest request = null; HttpWebResponse response = null; CookieContainer cc = new CookieContainer(); request = (HttpWebRequest)WebRequest.Create(DOMAIN+POSTURL); request.Method = POST; request.UserAgent = useragent; request.AllowAutoRedirect = false; request.CookieContainer = cc; request.KeepAlive = true; request.ContentType = CONTENTTYPE; byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata); request.ContentLength = postdatabyte.Length; Stream stream; stream = request.GetRequestStream(); stream.Write(postdatabyte, 0, postdatabyte.Length); stream.Close(); response = (HttpWebResponse)request.GetResponse(); CookieCollection cookies = request.CookieContainer.GetCookies(request.RequestUri); return cookies; } catch (Exception ex) { throw ex; } } /// <summary> /// 保存cookie,实现同步登录。 /// </summary> /// <returns></returns> public bool SyncBBSLogin() { bool resul = true; try { CookieCollection cookies = this.GetCookies(); foreach (Cookie cookie in cookies) { HttpCookie c = new HttpCookie(cookie.Name, cookie.Value); c.Domain = COOKIEDOMAIN; c.Path = COOKIEPATH; context.Response.AppendCookie(c); // context.Response.Write(c.Name+"="+c.Value+"<br>"); } } catch (Exception ex) { resul = false; throw ex; } return resul; } }
欢迎访问我的网站 编程思想