1.获取访问各页面的IP
2.获取各页面点击
3.记录某一ip的访问页面
4.记录访问途径(如:由百度、某一网站而来)
5.区分会员与非会员的访问以上在一个不大熟悉网站开发(做过一些桌面应用开发)的来说,说一下各项难易度

解决方案 »

  1.   

    /// <summary>
    /// 获取客户端IP
    /// </summary>
    /// <param name="page">页面</param>
    /// <returns></returns>
    private string GetClientIp(System.Web.UI.Page page)
    {
    //可以透过代理服务器
    string userIP = page.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (userIP == null || userIP == "")
    {
    //没有代理服务器,如果有代理服务器获取的是代理服务器的IP
    userIP = page.Request.ServerVariables["REMOTE_ADDR"];
    }
    return userIP;
    }Request.UrlReferrer
    Request.RawUrl
    Request.........
    .....
      

  2.   


    1:访问各个页面的IP可以很方便的HttpRequest中取得到。
    2:页面一旦响应给客户如果要检测客户的点击是比较麻烦的,因为点击的信息浏览器不会全部传回你的服务器,除非
    *你在页面上用脚本之类的记录点击并发回;
    *页面上所有的地址均是你网站上的其它页面,在其它页面上通过refers检查来源和cookies确定点击;
    3:和1一样,能够得到IP的前提就是它访问了某一个页面,所以这个问题只是如何比较好的实现。
    4:HTTP头中的refer
    5:通过session,一般使用cookies也可以使用其它如hidden form之类的。实现难度的话:
    2最难,5可能麻烦点,但没难度。其它都没什么难度,在页面中取到相关信息后往数据库里一写就OK。
      

  3.   

    1,最简单
    2,也很简单
    3,和2一样简单
    4,这个不知道
    5,这个很简单获取访客真实ip,这里考虑到代理服务器ip的滤过问题,两个函数放在一起使用
        //获取访客真实IP的函数
        public static string IPAddress()
        {
            string result = String.Empty;
            result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (result != null && result != String.Empty)
            {
                //可能有代理 
                if (result.IndexOf(".") == -1)     //没有“.”肯定是非IPv4格式 
                    result = null;
                else
                {
                    if (result.IndexOf(",") != -1)
                    {
                        //有“,”,估计多个代理。取第一个不是内网的IP。 
                        result = result.Replace(" ", "").Replace("'", "");
                        string[] temparyip = result.Split(",;".ToCharArray());
                        for (int i = 0; i < temparyip.Length; i++)
                        {
                            if (IsIPAddress(temparyip[i])
                                && temparyip[i].Substring(0, 3) != "10."
                                && temparyip[i].Substring(0, 7) != "192.168"
                                && temparyip[i].Substring(0, 7) != "172.16.")
                            {
                                return temparyip[i];     //找到不是内网的地址 
                            }
                        }
                    }
                    else if (IsIPAddress(result)) //代理即是IP格式 
                        return result;
                    else
                        result = null;     //代理中的内容 非IP,取IP 
                }
            }        string IpAddress = (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != String.Empty) ? HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] : HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];        if (null == result || result == String.Empty)
                result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];        if (result == null || result == String.Empty)
                result = HttpContext.Current.Request.UserHostAddress;        return result;
        }    //检验是否为IP格式的函数
        public static bool IsIPAddress(string str1)
        {
            if (str1 == null || str1 == string.Empty || str1.Length < 7 || str1.Length > 15) return false;        string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$";        Regex regex = new Regex(regformat, RegexOptions.IgnoreCase);
            return regex.IsMatch(str1);
        }至于获取页面点击和获取访客路径,只要把ip记录在库里面已统计就可以了
    至于会员和非会员涉及到一个认证机制,一般用session完成,会员登陆验证后在session里面写入一个身份标识,每次页面pageload的时候验证一下就可以,很简单
      

  4.   

    1.获取访问各页面的IP
    参考上面的代码
    2.获取各页面点击
    在页面里嵌入统计代码,自己写的,或者用别人的流量统计
    3.记录某一ip的访问页面
    在页面中嵌入获取IP的代码,然后将该IP保存到数据库或者啥的,由你自己定义
    4.记录访问途径(如:由百度、某一网站而来)
    HttpContext.Current.Request.UrlReferrer.ToString().Trim().ToLower()
    输出这句看看,不过如果是浏览器中输入地址直接访问页面的话,这句获取的应该是空值
    5.区分会员与非会员的访问 
    用session或者cookie区分,安全要求不是很高的话,建议用cookie
      

  5.   

    1楼的代码有点缺陷
    主要是HTTP_X_FORWARDED_FOR有些代理服务器不支持,另外多层代理服务器的情况就不好使了看起来2功能比较难,不是我想的那样,点击率是不是要用脚本来做呢?可能用js脚本,2功能我还确实没实现过,1,3,5都实现过,4的实现我在这里受教了!
      

  6.   

    5的代码我来给
    登陆的时候验证了是会员就
    Session["Custom_Dentify"] = "associator";
    然后再每个页面pageload的时候
    string l_Custom_Dentify = Session["Custom_Dentify"];
    if(l_Custom_Dentify.CompareWith(associator) == 0)
    {
       会员处理程序
    }
    else
    {
       非会员处理程序
    }
      

  7.   

    谢谢wdf618
    只差2的代码了
      

  8.   

    5.区分会员与非会员的访问 
    这个就有登陆的,记录session值,
    session值为空的是非会员或者会员没登陆
      

  9.   

    思路如下:
    如果同一台机器两次登陆算作两次访问的话,那这个就不需要写js代码了,因为你前面要获取页面的每一个用户的ip,这样只要在数据库里面设计一个计数就可以了,每次读一个ip就把数据库里面计数加1,或者在库里面写入每次获得的ip数据和登陆时间,然后select COUNT(...) ... 就可以了。如果同一台机器多次登陆算作一个用户访问的话,就需要用到cookie,在用户cookie里面写一个标识,每次登录读这个标识,如果读到,计数就不+1,否则+1。注意这里不用ip的原因是因为ip是可以改的,而且前面获取ip的代码在遇到多个(超过4个)代理服务器转接的时候可能会获取代理服务器的ip,这样会造成统计偏差。你可以用C#或者js操作cookie,都是一样有效,不过js的话涉及一个向服务器传值的问题,用request.form或者ajax实现。
    C#写入cookie的代码
    HttpCookie aCookie = new HttpCookie("lastVisit");
    aCookie.Value = DateTime.Now.ToString();
    aCookie.Expires = DateTime.Now.AddDays(1);
    Response.Cookies.Add(aCookie);C#读出cookie的代码
    if(Request.Cookies["userName"] != null)
    {
        HttpCookie aCookie = Request.Cookies["userName"];
        Label1.Text = Server.HtmlEncode(aCookie.Value);
    }js写入Cookie的代码
    var l_CookieValue = FormChatContent + l_newMessage;
    var OldChatCookie = l_CookieName + "=" + l_CookieValue;
    document.cookie = OldChatCookie; js读出cookie的代码
    function getCookie(searchName)
    {
      var cookies = document.cookie.split(";");
      for (var i = 0; i < cookies.length; i++)
      {
        var cookieCrumbs = cookies[i].split("=");
        var cookieName = cookieCrumbs[0];
       var cookieValue = cookieCrumbs[1];
        if (cookieName == searchName)
        {
          return cookieValue;
        }
      }
      return "";
    }然后验证,由于涉及到数据库,所以写入数据库的代码我没法写
    假设读出Cookie的值记录在l_ValueOFCookie中if(l_ValueOFCookie.ComparedWith("") == 0)
    {
        //更新数据库计数字段,使其自加;
        ...
    }