2011年5月13日

JS循环绑定对象或变量

做的一个tab的程序

<div id="topic">
            <div id="topictab" class="title">
                <ul id="ztdata">
                    <li id="topicline" class="normal"><a href="/zt/" rel="topicarea"  urn="#default_topic">
                    专 题 区</a></li>
                    <li class="active"><a href="http://database.ce.cn/district/sy/index.shtml" rel="topicarea" urn="datacenter">
                    数据中心</a></li>
                    <li class="active"><a href="http://database.ce.cn/district/sy/index.shtml" rel="topicarea" urn="datacenter">
                    数据中心</a></li>
                </ul>
            </div>
             <div class="topicarea">
            	<div id="ztdata0">
                 <ul class="floatLi">
                 <li>11111</li>
                 <li>2222</li> 
                 <li>3333</li>        
                 </ul>
                </div>
                 <div id="ztdata1">
                 内容2
                    
                </div>
                <div id="ztdata2">
                 内容三
                    
                </div>
            </div>
        </div>

<script type="text/javascript">
function initTab(preName)
{
    //设置样式,设置显示
    var titleNodes=document.getElementById(preName).getElementsByTagName("li"); //ul的id名称
    for(var i=0;i<titleNodes.length;i++)
    {
        map(titleNodes[i],preName,i);
        //titleNodes[i].onmouseover=changetab(preName,i);
        //eval("titleNodes[i].onmouseover=function(){changetab(preName,"+i+");};");   
    }
    changetab(preName,0); //显示前面的
}
function map(o,pre,i)
{
    o.onmouseover=function(){changetab(pre,i);}
}
function changetab(preName,tabNum)
{
    //显示数据内容
    var titleNodes=document.getElementById(preName).getElementsByTagName("li"); //ul的id名称
    for(var i=0;i<titleNodes.length;i++)
    {
        if(i==tabNum)
        {
            document.getElementById(preName+i).style.display="block";
            titleNodes[i].className="active";
        }
        else
        {
            document.getElementById(preName+i).style.display="none";
            titleNodes[i].className="normal";
        }
    }
}

initTab(“ztdata”);

</script>

 

解决方法:

一个是用eval

另外一个是在外程定义一个函数。

再一个是订义一个类,类的函数。(第二个类似)

posted @ 2011-05-13 10:42 墙外行人 阅读(117) 评论(0) 编辑

2011年5月12日

SSO单点登陆

 

从网上找到一篇比较详细的说明单点登陆的样式,与我的想像一致。

对于用户退出,我们可以在主站当中记录一下哪些站点登陆了,当某点退出时,将已登陆站的凭证清除即可。

 

http://www.cnblogs.com/igoogle/archive/2009/09/04/1560117.html

前些天一位朋友要我帮忙做一单点登录,其实这个概念早已耳熟能详,但实际应用很少,难得最近轻闲,于是决定通过本文来详细描述一个SSO解决方案,希望对大家有所帮助。SSO的解决方案很多,但搜索结果令人大失所望,大部分是相互转载,并且描述的也是走马观花。
      闲话少叙,进入正题,我的想法是使用集中验证方式,多个站点集中Passport验证。 如下图所示:

      为方便清晰描述,先定义几个名词,本文中出现之处均为如下含义。

主站:Passport集中验证服务器 http://www.passport.com/
分站http://www.a.com/http://www.b.com/http://www.c.com/
凭证:用户登录后产生的数据标识,用于识别授权用户,可为多种方式,DEMO中主站我使用的是Cache,分站使用Session。
令牌:由Passport颁发可在各分站中流通的唯一标识。
      OK,现在描述一下单点登录的过程:
      情形一、匿名用户:匿名用户访问分站a上的一个授权页面,首先跳转到主站让用户输入帐号、密码进行登录,验证通过后产生主站凭证,同时产生令牌,跳转回分站a,此时分站a检测到用户已持有令牌,于是用令牌再次去主站获取用户凭证,获取成功后允许用户访问该授权页面。同时产生分站a的本地凭证,当该用户需要再次验证时将先检查本地凭证,以减少网络交互。
      情形二、在分站a登录的用户访问分站b:因为用户在分站a登录过,已持有令牌,所以分站b会用令牌去主站获取用户凭证,获取成功后允许用户访问授权页面。同时产生分站b的本地凭证。

      设计完成后,接下来是方案实现的一些关键点:
      令牌:令牌由主站颁发,主站颁发令牌同时生成用户凭证,并记录令牌与用户凭证之间的对应关系,以根据用户提供的令牌响应对应的凭证;令牌要在各跨域分站中进行流通,所以DEMO中令牌我使用主站的Cookie,并指定Cookie.Domain="passport.com"。各分站如何共享主站的Cookie?从分站Redirect到主站页面,然后该页面读取Cookie并以URL参数方式回传即可,可在DEMO代码中查看详细实现,当然如果哪位有更好的令牌实现方式也拿出来分享。

//产生令牌
string tokenValue = Guid.NewGuid().ToString().ToUpper();
HttpCookie tokenCookie = new HttpCookie("Token");
tokenCookie.Values.Add("Value", tokenValue);
tokenCookie.Domain = "passport.com";
Response.AppendCookie(tokenCookie);


      主站凭证
:主站凭证是一个关系表,包含了三个字段:令牌、凭证数据、过期时间。有多种实现方式可供选择,要求可靠的话用数据库,要求性能的话用Cache,DEMO中我使用的是Cache中的DataTable。如下代码所示:

/// <summary>
/// 初始化数据结构
/// </summary>
/// <remarks>
/// ----------------------------------------------------
/// | token(令牌) | info(用户凭证) | timeout(过期时间) |
/// |--------------------------------------------------|
/// </remarks>
private static void cacheInit()
{
if (HttpContext.Current.Cache["CERT"] == null)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("token", Type.GetType("System.String"));
        dt.Columns["token"].Unique = true;
        dt.Columns.Add("info", Type.GetType("System.Object"));
        dt.Columns["info"].DefaultValue = null;
        dt.Columns.Add("timeout", Type.GetType("System.DateTime"));
        dt.Columns["timeout"].DefaultValue = DateTime.Now.AddMinutes(double.Parse(System.Configuration.ConfigurationManager.AppSettings["timeout"]));
        DataColumn[] keys = new DataColumn[1];
        keys[0] = dt.Columns["token"];
        dt.PrimaryKey = keys;
//Cache的过期时间为 令牌过期时间*2
        HttpContext.Current.Cache.Insert("CERT", dt, null, DateTime.MaxValue, TimeSpan.FromMinutes(double.Parse(System.Configuration.ConfigurationManager.AppSettings["timeout"]) * 2));
    }
}

      分站凭证:分站凭证主要用于减少重复验证时网络的交互,比如用户已在分站a上登录过,当他再次访问分站a时,就不必使用令牌去主站验证了,因为分站a已有该用户的凭证。分站凭证相对比较简单,使用Session、Cookie均可。

      分站SSO页面基类:分站使用SSO的页面会做一系列的逻辑判断处理,如文章开头的流程图。如果有多个页面的话不可能为每个页写一个这样的逻辑,OK,那么把这套逻辑封装成一个基类,凡是要使用SSO的页面继承该基类即可。如下代码所示:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
namespace SSO.SiteA.Class
{
/// <summary>
/// 授权页面基类
/// </summary>
public class AuthBase : System.Web.UI.Page
    {
protected override void OnLoad(EventArgs e)
        {
if (Session["Token"] != null)
            {
//分站凭证存在
                Response.Write("恭喜,分站凭证存在,您被授权访问该页面!");
            }
else
            {
//令牌验证结果
if (Request.QueryString["Token"] != null)
                {
if (Request.QueryString["Token"] != "$Token$")
                    {
//持有令牌
string tokenValue = Request.QueryString["Token"];
//调用WebService获取主站凭证
                        SSO.SiteA.RefPassport.TokenService tokenService = new SSO.SiteA.RefPassport.TokenService();
object o = tokenService.TokenGetCredence(tokenValue);
if (o != null)
                        {
//令牌正确
                            Session["Token"] = o;
                            Response.Write("恭喜,令牌存在,您被授权访问该页面!");
                        }
else
                        {
//令牌错误
                            Response.Redirect(this.replaceToken());
                        }
                    }
else
                    {
//未持有令牌
                        Response.Redirect(this.replaceToken());
                    }
                }
//未进行令牌验证,去主站验证
else
                {
                    Response.Redirect(this.getTokenURL());
                }
            }
base.OnLoad(e);
        }
/// <summary>
/// 获取带令牌请求的URL
/// 在当前URL中附加上令牌请求参数
/// </summary>
/// <returns></returns>
private string getTokenURL()
        {
string url = Request.Url.AbsoluteUri;
            Regex reg = new Regex(@"^.*\?.+=.+$");
if (reg.IsMatch(url))
                url += "&Token=$Token$";
else
                url += "?Token=$Token$";
return "http://www.passport.com/gettoken.aspx?BackURL=" + Server.UrlEncode(url);
        }
/// <summary>
/// 去掉URL中的令牌
/// 在当前URL中去掉令牌参数
/// </summary>
/// <returns></returns>
private string replaceToken()
        {
string url = Request.Url.AbsoluteUri;
            url = Regex.Replace(url, @"(\?|&)Token=.*", "", RegexOptions.IgnoreCase);
return "http://www.passport.com/userlogin.aspx?BackURL=" + Server.UrlEncode(url);
        }
    }//end class
}

      用户退出:用户退出时分别清空主站凭证与当前分站凭证。如果要求A站点退出,B、C站点也退出,可自行扩展接口清空每个分站凭证。
      主站过期凭证/令牌清除:定时清除(DataTable)Cache[“CERT”]中timeout字段超过当前时间的记录。
点击此处下载DEMO

1.在IIS中配置站点

配置4个站点指向相应的目录,并分别指定4个站点的主机头:

http://www.passport.com/

http://www.a.com/

http://www.b.com/

http://www.c.com/

2.修改hosts文件以将域名解析到本地站点

127.0.0.1          http://www.passport.com/

127.0.0.1 http://www.a.com/

127.0.0.1 http://www.b.com/

127.0.0.1          http://www.c.com/

posted @ 2011-05-12 18:07 墙外行人 阅读(68) 评论(0) 编辑

Aop的用途

Aop可以实现的功能。

Authentication 权限

l Caching 缓存

l Context passing 内容传递

l Error handling 错误处理

l Lazy loading 懒加载

l Debugging 调试

l logging, tracing, profiling and monitoring 记录跟踪 优化 校准

l Performance optimization 性能优化

l Persistence 持久化

l Resource pooling 资源池

l Synchronization 同步

l Transactions 事务

posted @ 2011-05-12 16:40 墙外行人 阅读(24) 评论(0) 编辑

2011年4月22日

关于ORM的思考

其实,对于三层,如果采用orm,一般是使用胖Model设计。

 

其实现在突然感觉有必要用orm来实现么?

如果不用,那上层如何传递查询条件呀?直接传SQL

posted @ 2011-04-22 15:03 墙外行人 阅读(23) 评论(0) 编辑

2011年3月25日

windows下Git服务器的安装

 

准备的软件:copSSH,msysGit.

 软件的安装不多说了。主要说一下配置内容。

1.Git的配置

 

首先、需要在Git的安装目录里找到cmd目录,这里就是C:\Git\cmd了。在里面创建如下几个文件:  git, git-upload-pack, git-upload-archive, git-receive-pack。这里都没有扩展名的,主要是给登录后,由bash执行的。每个文件都只有一行,分别是:
git里写  git.cmd $*
git-upload-pack里写  git upload-pack $*
git-upload-archive里写  git upload-archive $*
git-receive-pack里写  git receive-pack $*

 注意为了可以上传,要修改一下.git里面的配置文件

[receive]

denyCurrentBranch=ignore

2.copSSH的设置

(1)激活用户

 (2)找到CopSSH安装目录的etc下的profile文件。这里就是C:\ICW\etc\profile了:在文件最后添加两行


gitpath=`/bin/cygpath C:/Git/cmd`  #这里不是引号,路径是Git下的cmd,斜杠也要用Unix的习惯 如果路径有空格,要用双引号括起来
export PATH="$PATH:$gitpath"

(3)上在2步的方法可以使用ln -s ,因为使用 putty可登陆,但是TortoiseGit总出错,所以不使用上面的方法

 

 

3.key的生成

使用putty的生成,注意,公钥采用复制的方式保存在copSSH/home/<user>/.ssh里面的

authorized_keys

 

 

 

posted @ 2011-03-25 11:45 墙外行人 阅读(1114) 评论(0) 编辑

2009年4月16日

墙外打印控件 套打说明 精确打印

原文地址:http://www.xwangye.com/WebProg/8_312.html

有什么问题请加入群2883340 或联系QQ85161676 也可发邮件到 xwangye@qq.com

说明

很多朋友在套打时经常出现页面上的对象无法对齐的情况,这里我们谈论几个小技巧,来使我们的套打操作更方便。希望朋友们好好理解一下本篇文章。

长度单位

我们知道,平时做网页时最常用的长度单位就是像素(px),但是实际中我们无法量出票据上的位置的像素数,我们能量出的只是长度单位cm或mm.

其实,在网页中设置对象的宽度还可以使用mm作为单位,只是因为我们在设计网页时不经常使用,所以我们在制作打印模板网页时可能会想不起这个单位。只要我们利用好这个单位,实现精确打印操作是没有问题的。

元素定位

在网页中,我们可以使用positon属性来定位,这对于我们精确定位打印元素是非常有利。比如,我定义一个我要把“墙外打印控件套打测试”这几个字显示到距上边40mm,左侧30mm,我可以这样定义一个span对象的样式:

1<body style="margin:0px;padding:0px;">
2<span style="posistion:absolute;top:40mm;left:30mm;">墙外打印控件套打测试</span>
3</body>

注意:上述在设置打印控件的属性PrintActiveX.padding="0"时,并且忽略打印机的的上、左不可打印区域的影响时,才有效。 否则,该span的定位会受上、左不可打印域和页边距的影响。

说到这里可能有朋友不理解了,页边距我们可以设置,但打印机的上、左不可打印区域是不一定的呀,那绝对定位是不是就不能使用了呢?

不是的,其实,在墙外打印控件2.0中,我们增中了一个属性:ignoreUp(ignore unprintable),我们只要设置该属性为2即可忽略打印机的不可打区域的影响。这是墙外打印控件为大家更好的设计精确打印页面而特别设计的一个属性。

上面的方面比较简单,我这里主要用另外一个稍复杂点的方法,来实现忽略不可打印区域的影响。另外一个办法就是,我们只要设置一个稍大一些的页边距,即可忽略不可打印区域的影响。因为当上页边距大于上不可打印机区域时,打印是从上页边距开始的,此时就不受上打印区域的影响。

因此,上面的绝对定位可以通过,设置paddingLeft=150和paddingTop=150,然后再设置span的Top:25mm;left:15mm即可实现要求的上边40mm和左侧30mm。

多页定位

上面的定位方式对于一页来说定位是很方便的,但是如果打印的内容有两页或更多页时,则除第一页(打印页)外的页上的元素则不是那么好定位。那么对于多页时,我们如何定位呢?

首先写一段测试代码:

Code
测试目标:实现代码中的两个div在各自页中的同一高度,并且离页顶30mm。

首先看一下运行的结果图片。从图中,通过屏幕标尺,我们可以看到这两个DIV在同一张纸的同一高度。

大家注意第二个div的top值为105mm。这个值是如何计算出来的呢?其实,就是第一个div的高度再加上一个内容页的高度(注意是内容页的高度)。内容页的度是是纸张的高度减去上下边距的高度(此处忽略不可打印边距的影响,关于为什么忽略请看仔细看上面的内容),也就是1200-150-150=900,也就是90mm。这样第二个div的正确的绝对高度也就可以确定了。

posted @ 2009-04-16 22:13 墙外行人 阅读(1479) 评论(2) 编辑

2008年8月27日

墙外打印控件帮助手册

posted @ 2008-08-27 09:33 墙外行人 阅读(1903) 评论(0) 编辑

2008年8月26日

墙外Web打印控件(QWPrint)发布

posted @ 2008-08-26 10:42 墙外行人 阅读(2160) 评论(6) 编辑

2007年12月18日

关于面向对象设计--关联

posted @ 2007-12-18 16:13 墙外行人 阅读(263) 评论(0) 编辑

2007年12月7日

名词解释

posted @ 2007-12-07 09:13 墙外行人 阅读(42) 评论(0) 编辑

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

昵称:墙外行人
园龄:4年2个月
粉丝:0
关注:0

搜索

 
 

常用链接

随笔分类

随笔档案

文章分类

相册

最新评论

阅读排行榜

评论排行榜

推荐排行榜