onmouseout="this.style.backgroundColor=''" style="CURSOR: hand">
普通iframe页面
iframe自适应高度
iframe(嵌入式帧)自适应高度 填写的嵌入地址一定要和本页面在同一个站点上,否则会提示“拒绝访问!”。对跨域引用有权限问题,请查阅其他资料。
字号缩放 越来越多的人长时间的泡网,眼镜的普及率也越来越高,让文字大点,让更多的用户看的更清楚。
需要指定大小的文字 大 中 小
select挡住div的解决方法 在div里加入下面的代码,根据需要调整就可以了。
跳转菜单新窗口
flash透明选项
记录并显示网页的最后修改时间
让IFRAME框架内的文档的背景透明
打开窗口即最大化
文字或图片弹出指定大小的窗口 在body中加入
弹出代码 图片或文字
flash按钮加链接 on (press) { getURL("","_blank"); }
细线分隔线
消除ie6自动出现的图像工具栏,设置 GALLERYIMG属性为false或no .
禁止页面正文内容被选取
不能点右键,不用CTRL+A,不能复制作! onkeypress="window.event.returnValue=false" onkeydown="window.event.returnValue=false" onkeyup="window.event.returnValue=false" ondragstart="window.event.returnValue=false" onselectstart="event.returnValue=false">
随机变换背景图象(一个可以刷新心情的特效)
flash载入影片 on (release) { loadMovie("1-01.swf", "_root.loaderclip"); }
图片表单按钮
左右阴影背景的CSS定义方法 body { text-align:center; background-repeat: repeat-y; background-position: center; background-image: url(../images/bg.jpg); }
如何关闭层
关闭层
运行代码框
给表格做链接
CSS文字阴影 .shadowfont{FILTER: dropshadow(color=#666666, offx=1, offy=1, positive=1); FONT-FAMILY: "宋体"; FONT-SIZE: 9pt;COLOR: #ffffff;}
表格透明 style="FILTER: alpha(opacity=72)"
Alt和Title的区别 alt 用来给图片来提示的。Title用来给链接文字或普通文字提示的。
文字
文字
在同一页面设置不同文字链接效果的样式
文字
在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错) 首 选请确认SQL SERVER EXPRSS已安装到本地计算机上,并且SQL SERVER (SQLEXPRESS)服务已经成功启动。如果问题仍然存在,可以尝试应打开“SQL Server 外围应用配置器”,选择“服务和连接的外围应用配置器”,然后将“远程连接”配置为“同时使用 TCP/IP 和 named pipes”
由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。 将连接字符串中的“User Instance=True”修改为“User Instance=False”即可。
无法将文件 'X:WebsiteApp_DataDatabase.mdf' 作为数据库 ''. 附加。当前命令发生了严重错误。应放弃任何可能产生的结果。 需要为X分区以及X分区的子文件夹和文件分配Users组的“读取”权限。
尝试为文件 X:WebsiteApp_DataDatabase.mdf 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。 首 选要确认已经为X分区以及X分区的子文件夹和文件分配了Users组的“读取”权限。如果问题仍然存在,请使用SQL Server Management Studio连接到SQLEXPRESS数据库实例,检查是否有名称是“Database”的数据库存在。如果有,分离同名数据库即可。如果还有问题检查web.config中Data Source=.\SQLEXPRESS,如果同时装了sql2000名称应为MSSQL$SQLEXPRESS。
无法打开用户默认数据库。登录失败。 用户 'NT AUTHORITYNETWORK SERVICE' 登录失败。 数据库文件Database.mdf 的读写权限被设置成只有NETWORK SERVICE才具有。解决方法是先停止掉SQL SERVER (SQLEXPRESS)服务,然后从父项集成权限,再次启动SQL SERVER (SQLEXPRESS)服务即可。
以上是一个简化版本关系图. User:用户表,存放用户信息 Role:角色表,存放角色信息 UserInRole:用户角色映射表,存放用户和角色的对就关系,多对多,一个用户可以对应多个 角色,而不同的角色有一同的权限。 Permissions:权限表,不同的角色对应不同的权限。权限信息使用一个字段flag来表示, 好处是可以使用位运算来计算权限,缺点是用位标识的权限受理论值限制,如int理论上可以 标识31种不同的权限, 当然可以整加一个字段来弥补,ApplicationID标识不同的模块 Application:模块信息。
[Flags] public enum Flag:long { View=1, Edit=2, Delete=4 }
特性[Flag]告诉编译器,当编译器看到Flag枚举时,它会充许你用|(or)操作符组合枚举值, 就像二的整数幂一样, 例如 Flag Administer=Flag.View|Flag.Edit|Flag.Delete;表示三种权限的组合。
基础知识:
位运算
枚举Flag
当编译器看到Flag枚举时,它会充许你用|(or)操作符组合枚举值, 就像二的整数幂一样, 例如 Flag Administer=Flag.View|Flag.Edit|Flag.Delete;
常用操作,检查是否存在 Flag administer=Flag.View|Flag.Edit|Flag.Delete; public bool Check(Flag administer,Flag mask) { bool bReturn = false; if ((administer & mask) == mask) bReturn = true;
return bReturn; } 调用 Check(administer,Flag.Edit)将返回true.
public Flag SetBit(Flag administer,Flag mask) { return administer |= mask; }
administer |= mask;操作相当于 administer = administer |mask;
从枚举中减去一种状态 administer &=mask;
如 : Flag administer=Flag.View|Flag.Edit|Flag.Delete; 如需要禁止删除权限. administer &=Flag.Delete;
另外,标记为flag的枚举类型,可以不设置值 public enum Flag:long { View, Edit, Delete } 如需要设置,按以下规律, View=1,Edit=2,Delete=4,Reply=8按2次方累加,为什么会这样?因为他使用二进制操作, 当你使用 View=1,Edit=2,Delete=3,Reply=4这样的值, Flag.Delete 包含的值是Flag.Delete还是View=1|Edit=2就无从检测了.
每个用户,可以属于不同的角色不同的角色分配不同的权限,计算所有解权的所有可能的权限组合,只要有充许的权限,那么该用户既获取该权限。
在CS系统中,Permissions表合用了二个字段来标识权限. AllowMask,DenyMask 规责是Deny优先,也就是说当权限标记为Deny那么不论是否Allow一律禁止该用户进行此项操作。
另外,像论坛类的权限设计,仅仅一个ApplicationID字段是不够用的,因为每个版块都需要设置不同的权限,来控制权限的粒度,可在增加一张Permission表,ApplicationID修改为版块ID 这样,就可以针对不同的版块设置不同的权限
好了,接下的问题是怎么和.net自带的权限系统挂钩了。。
在asp.net系统中 ,HttpContext.Current.User实现了一个接口IPrincipal,IPrincipal包含了另一个接口Identity
我们在设计User类的时候继承此接口 public class User:IPrincipal { string username; public string Username { get{return username;} set{username=value;} } }
实现IPrincipal接口方法 public IIdentity Identity { get { if (!string.IsNullOrEmpty(username)) _Identity = new GenericIdentity(username,"Forums"); return (IIdentity)_Identity; } }
public bool IsInRole(string role) { ..... }
怎样和asp.net挂钩呢,这里可以在登陆时做检查
if(HttpContext.Current!=null){ User u= Users.GetUser(name); HttpContext.Current.User =u;
在使用时 User u = HttpContext.Current.User as User; 当然检查用户角色可以直接用
if(HttpContext.Current.User.Identity.IsAuthenticated&&HttpContext.Current.User.IsInRole(角色名))
另外可以直接把到当用户权限策略挂接到当前线程 ,使用以下方法 AppDomain.CurrentDomain.SetPrincipalPolicy(User);
好了,接下来,怎么check权限?
我倾向于使用Attribute
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Delegate, Inherited = true, AllowMultiple = true)] public class CheckPermissionAttribute : Attribute {
int appID; public int ApplicationID { get { return appID; } set { appID = value; } } Permission _allMask; public Permission AllMask { get { return _allMask; } set { _allMask = value; } }
public CheckPermissionAttribute(ApplicationID app, Permission allMask) { appID = app; _allMask = allMask; } public CheckPermissionAttribute(Permission allMask) { _allMask = allMask; }
} AttributeUsage 第一个参数表示该属性可以应用于类,方法,属性,代理上 Inherited 检查继承的权限。 AllowMultiple 充许多次应用。
按下来,设计一个基类,继承自Page:
public class PageBase : Page { Flag _allMask;
/// /// 检查类型权限 /// public void CheckClass() { Type type = this.GetType(); CheckPermissionAttribute att = (CheckPermissionAttribute)CheckPermissionAttribute.GetCustomAttribute(type, typeof(CheckPermissionAttribute)); if (att != null) { Check(att.AllMask); } }
/// /// 检查函数调用权限 /// /// 方法名 public void CheckMethod(string methodName) { Type type = this.GetType(); string name = "*"; if (!string.IsNullOrEmpty(methodName)) name = methodName; MemberInfo[] mis = type.FindMembers(MemberTypes.Method ,BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase,Type.FilterNameIgnoreCase,name); foreach (MethodInfo m in mis) { CheckPermissionAttribute att = (CheckPermissionAttribute)CheckPermissionAttribute.GetCustomAttribute(m, typeof(CheckPermissionAttribute)); if (att != null) {
Check(att.AllMask); } } return; } public void Check(Flag permissions) { if (!CheckPermission(permissions)) { string url = string.Format("MsgPage.aspx?msg={0}", HttpUtility.UrlEncode("您没有权限访问该资源")); Response.Redirect(url); } } public void Check(ApplicationID appID, Flag permissions) { PermissionManager pm= Spaces.PermissionManager.Instance(appType); if (!CheckPermission(pm,permissions)) { string url = string.Format("MsgPage.aspx?msg={0}", HttpUtility.UrlEncode("您没有权限访问该资源")); Response.Redirect(url); }
}
protected override void OnInit(EventArgs e) { CheckClass(); base.OnInit(e); } }
如何使用:
[CheckPermission(2, Flag.View)] public partial class MyPage : PageBase {
}
若没有查看权限,会自运导向错误页面。
在类上应用挺方便。
方法上应用我于一个方法比较麻烦,我还没有找到在页面class里怎么获取当前调用的类名.
可以调用 CheckMethod(方法名称);如 [CheckPermission(2, Flag.Delete)] public partial class MyPage : PageBase { public void test() { CheckMethod("test"); ....... } }
|