1. 程式人生 > >網頁中嵌入外部頁面的四種方法

網頁中嵌入外部頁面的四種方法

線上製作icon圖示
http://www.chami.com/html-kit/services/favicon/

進入主頁以後自動播放聲音
<embed src="http://你的網站/music.rm" hidden=true autostart=true loop=true>

進入主頁後自動最大話,省的去在自己單擊了
<script>
self.moveTo(0,0)
self.resizeTo(screen.availWidth,screen.availHeight)
</script>

顯示現在時間的指令碼
<script language=vbscript>document.write now</script>

顯示最後修改時間的指令碼


<script>document.write(document.lastModified)</script>

設為首頁,加為收藏,加入頻道,啟動outlook發信
<a style="cursor:hand" 
onclick="this.style.behavior="url(#default#homepage)";
this.setHomePage("yourURL">設為首頁</a>

<a style="cursor:hand"
onclick="window.external.AddFavorite(location.href,document.title);">加入收藏</a>

<a href=javascript:window.external.addChannel("typhoon.cdf")>加入頻道</a>

<a href="youEmail">與我聯絡</a>

Flash中在按鈕上如何加“設為首頁”“加入收藏”?action怎麼寫啊?

on (release) {
getURL("javascript:void(document.links[0].style.behavior='url(#default#homepage)');void document.links[0].setHomePage('84design.com/" target="_blank">http://www.84design.com/&#39;);", "_self");
}

加入收藏:
on(release) {
getURL("javascript:window.external.AddFavorite('84design.com/" target="_blank">
http://www.84design.com/&#39;,&#39;E佳工作室&#39;
)");
}

狀態列動態顯示現在時間
<script>
function see(){
window.setTimeout("see()",1000);
today = new Date();
self.status = today.toString();
}
</script>
<body onload=see()>

關閉視窗的指令碼
<a href=javascript:close()>[關閉視窗]</a>

視窗定時關閉
先將如下程式碼網頁檔案的<head></head>區:
 <script language="JavaScript">
 function closeit() { setTimeout("self.close()",10000) //毫秒 }
 </script>
然後再在<body></body>標內加入如:<body onload="closeit()">

網頁自動關閉
 <html>
 <head>
 <object id=closes type="application/x-oleobject"
 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
 <param name="Command" value="Close">
 </object>
 </head>
 <body onload="window.setTimeout('closes.Click()',10000)">
 這個視窗會在10秒過後自動關閉,而且不會出現提示.
 </body>
 </html>

按下F12鍵,直接返回首頁
<script>function look(){
if(event.keyCode==123){document.location.href=http://www.wowo-design.com/}
}
if(document.onkeydown==null)
{document.onkeydown=look}
</script>

後退,重新整理,前進
<input type=button value=後退 onclick=history.go(-1)>
<input type=button value=重新整理 onclick=history.go(-0)>
<input type=button value=前進 onclick=history.go(+1)>

設定時間彈出視窗,4000=4秒,當然你可以自定義
<script>function l() {
window.open("yourURL","name","width=500,height=150,border=0")
}
setTimeout("l()",4000)
</script>

隨機替換圖片 <script>
 document.write('<img src="img/'+parseInt(Math.random()*(5))
 +'.gif"height="40" width="50">')
</script>

圖片檔名為0.gif 1.gif 2.gif 3.gif 4.gif

防止表格被撐破的程式碼
<table width=100 border=1>
<tr><td style="word-break:break-all">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</td></tr>

Dreamweaver裡畫細線標格
<table style="border-collapse: collapse">

有沒有可能用層來遮住FLASH?
1.在flash的parameters里加入 <param name="wmode" value="transparent">
2.<body onblur=self.focus()>

如何讓Flash按鈕同時開啟兩個網頁
最簡單的辦法,最一個按扭,把
on(press){
getURL("http://www.*****.com";,_blank);
getURL("http://www.*****.com";,_blank);
}
加在按扭上

怎樣點不同的連結在同一個Iframe裡顯示?
<table width="510" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="218" align="center" bgcolor="#eeeeee"><a href="http://www.******.com"; target="manager">blueidea</a>
</td>
<td width="292" align="center" bgcolor="#eeeeee"><a href="http://www.******.com/bbs"; target="manager">bbs</a></td>
</tr>
<tr>
<td height="200" colspan="2"><iframe border=0 frameborder=0 framespacing=0 height=200 marginheight=0 marginwidth=0 name=manager scrolling="NO" noresize src="http://www.******.com"; width=500 vspale="0"></iframe></td>
</tr>
</table>

節日倒計時
<Script Language="JavaScript">
   var timedate= new Date("October 1,2002");
   var times="國慶節";
   var now = new Date();
   var date = timedate.getTime() - now.getTime();
   var time = Math.floor(date / (1000 * 60 * 60 * 24));
   if (time >= 0)
   document.write("現在離"+times+"還有: "+time +"天")
</Script>

隨機變換背景圖象(一個可以重新整理心情的特效)
在<head></head>之間加上如下程式碼:
<Script Language="JavaScript">
   image = new Array(4); //定義image為圖片數量的陣列
   image [0] = 'tu0.gif' //背景圖象的路徑
   image [1] = 'tu1.gif'
   image [2] = 'tu2.gif'
   image [3] = 'tu3.gif'
   image [4] = 'tu4.gif'
   number = Math.floor(Math.random() * image.length);
   document.write("<BODY BACKGROUND="+image[number]+">");
</Script>

select擋住div的解決方法
在div里加入下面的程式碼,根據需要調整就可以了。
<iframe src="javascript:false" scrolling="no" frameborder="0" style="z-index:-1;position:absolute; top:5px; left:2px;width:168;height:100px;">
</iframe>

伺服器上如何定義連線
MM_www_STRING ="driver={Microsoft access Driver (*.mdb)};dbq=" & server.mappath("../data/www.mdb")

連結到
response.redirect"login.asp"
location.href="xx.asp"

取得IP
userip = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If userip = "" Then userip = Request.ServerVariables("REMOTE_ADDR")

sql="update feedbak set hit=hit+1 where id="&request("id")
conn.execute(sql)

擷取字元是否加...
function formatStr(str,len)
if(len(str)>len)
str = left(str,len) + "..."
end if
formatStr = str
end function

接收表單
If Ucase(Request.ServerVariables("REQUEST_METHOD")) = "POST" then
end if

圖片寬度
<script language="javascript">
<!--
var flag=false;
function DrawImage(ckp){
var image=new Image();
image.src=ckp.src;
if(image.width>0 && image.height>0)
{flag=true;
if(image.width>120){
ckp.width=120;
}else{
ckp.width=image.width;
}
ckp.alt=image.width+"×"+image.height;
}
}
//-->
</script>
I'll be Back 22:18:06
<img src="<%=formPath%>/<%=rs("photoname")%>" border="0" >

跳轉
<meta http-equiv=refresh content='0; url=/distributor/distributor.aspx'>

溢位欄的設制
visible:超出的部分照樣顯示;
hidden:超出的部分隱藏;
scrool:不管有否超出,都顯示滾動條;
auto:有超出時才出現滾動條;

onMouseOver:滑鼠移到目標上;
onMouseUp:按下滑鼠再放開左鍵時;
onMouseOut:滑鼠移開時;
onMouseDown:按下滑鼠時(不需要放開左鍵);
onClink:點選時;
onDblClick:雙擊時;
onLoad:載入網頁時;
onUnload:離開頁面時;
onResize:當瀏覽者改變瀏覽視窗的大小時;
onScroll:當瀏覽者拖動滾動條的時。

CSS樣式
a:link:表示已經連結;
a:hover:表示滑鼠移上鍊接時;
a:active:表示連結啟用時;
a:visited:表示己點選過的連結。

跳出對話方塊連結
javascript:alert('lajflsjpjwg')

後退:javascript:history.back(1)

關閉視窗:javascript:window.close();

視窗還原
function restore(){
window.moveTo(8,8);
window.resizeTo(screen.width-24,screen.availHeight-24);
}

head區是指首頁HTML程式碼的<head>和</head>之間的內容。
必須加入的標籤

1.公司版權註釋

<!--- The site is designed by Maketown,Inc 06/2000 --->

2.網頁顯示字符集

簡體中文:<META HTTP-EQUIV="Content-Type" C>
繁體中文:<META HTTP-EQUIV="Content-Type" C>
英 語:<META HTTP-EQUIV="Content-Type" C>

3.網頁製作者資訊

<META name="author" c>

4.網站簡介

<META NAME="DESCRIPTION" C>

5.搜尋關鍵字

<META NAME="keywords" C>

6.網頁的css規範

<LINK href="style/style.css" rel="stylesheet" type="text/css">
(參見目錄及命名規範)

7.網頁標題

<title>xxxxxxxxxxxxxxxxxx</title>

可以選擇加入的標籤
1.設定網頁的到期時間。一旦網頁過期,必須到伺服器上重新調閱。
<META HTTP-EQUIV="expires" C>

2.禁止瀏覽器從本地機的快取中調閱頁面內容。
<META HTTP-EQUIV="Pragma" C>

3.用來防止別人在框架裡呼叫你的頁面。
<META HTTP-EQUIV="Window-target" C>

4.自動跳轉。
<META HTTP-EQUIV="Refresh" C>
5指時間停留5秒。

5.網頁搜尋機器人嚮導.用來告訴搜尋機器人哪些頁面需要索引,哪些頁面不需要索引。
<META NAME="robots" C>
CONTENT的引數有all,none,index,noindex,follow,nofollow。預設是all。

6.收藏夾圖示
<link rel = "Shortcut Icon" href="favicon.ico">

所有的javascript的調用盡量採取外部呼叫.
<SCRIPT LANGUAGE="javascript" SRC="script/xxxxx.js"></SCRIPT>

附<body>標籤:

<body>標籤不屬於head區,這裡強調一下,為了保證瀏覽器的相容性,必須設定頁面背景<body bgcolor="#FFFFFF">

flash透明

在flash的原始碼中加上:<param name="wmode" value="transparent"> 表格透明
style="FILTER: alpha(opacity=72)"

網址前新增icon的方法
1、上http://www.******.com上用他的icon editor online製作一個圖示。他會將做好的圖示通過email即時傳送給你。

2、把這個命名為favicon.ico的圖示放置在index.html同一個資料夾中。就可以了。

作一個圖示檔案,大小為16*16畫素。副檔名為ico,然後上傳到相應目錄中。在HTML原始檔“<head></head>”之間新增如下程式碼:

<Link Rel="SHORTCUT ICON" href="http://圖片的地址(注意與剛才的目錄對應)">

其中的“SHORTCUT ICON”即為該圖示的名稱。當然如果使用者使用IE5或以上版本瀏覽時,就更簡單了,只需將圖片上傳到網站根目錄下,自動識別

可以在收藏夾中顯示出你的圖示
<link rel="Bookmark" href="favicon.ico">

狀態列連線說明
<A HREF="連結到某處" >某某連結</a>
連結說明
<a href=“”Title=連結說明>

禁止滑鼠右鍵
在<body>標籤中加入 <body >

禁止複製,滑鼠拖動選取
<body ondragstart=window.event.returnValue=false oncontextmenu=window.event.returnValue=false onselectstart=event.returnValue=false>

水平線
<hr width="長度" size="高度" color="顏色程式碼" noshade> noshade為有無陰影

表單電子郵件提交
< form name="content" method="post" action="mailto:電子郵箱" >< /form>
文字域名為Subject 為郵件的標題
郵件連結定製
Mailto:地址 ? Subject=郵件的標題 &bc=抄送 &bcc=密件抄送

背景音樂
<bgsound src=地址 loop="-1">

消除ie6自動出現的影象工具欄,設定 GALLERYIMG屬性為false或no .
<IMG SRC="mypicture.jpg" HEIGHT="100px" WIDTH="100px" GALLERYIMG="no">

防止點選空連結時,頁面往往重置到頁首端
程式碼“javascript:void(null)”代替原來的“#”標記

如何避免別人把你的網頁放在框架中
<script language=“javascript”><!--if (self!=top){top.location=self.location;} -->< /script>

頁面定時重新整理
<meta http-equiv="Refresh" c >

頁面定時轉向新的地址
<meta http-equiv="refresh" c>

顯示日期
<script language="javascript"><!--
today=new Date();
var week; var date;
if(today.getDay()==0) week="星期日"
if(today.getDay()==1) week="星期一"
if(today.getDay()==2) week="星期二"
if(today.getDay()==3) week="星期三"
if(today.getDay()==4) week="星期四"
if(today.getDay()==5) week="星期五"
if(today.getDay()==6) week="星期六"
date=(today.getYear())+"年"+(today.getMonth()+1)+"月"+today.getDate()+"日"+" "
document.write("<span style='font-size: 9pt;'>"+date+week+"</span>");
// -->
</script>

文字滾動
插入邊框為0的1行1列的表格,在表格中輸入文字,選中文字,
按ctrl+t輸入marquee direction="up", 回車即可讓文字在表格區域內向上滾動。
(right、down可用於讓文字或圖象向右及向下滾動,修改html原始碼還可以得到需要的滾動速度。

表單驗正
<SCRIPT language=javascript>
function checkform(theform){
if(theform.name.value==""){
alert("姓名不能為空!");
theform.name.focus();
return false;
}
if(theform.tel.value==""){
alert("電話不能為空!");
theform.tel.focus();
return false;
}
}
</SCRIPT>

定義滑鼠
body{cursor: url(cur.ani或cur);}

以圖片方式插視訊
<IMG height=240 loop=infinite dynsrc=http://amedia.efu.com.cn/EFUADD0001.rmvb width=320>

層在flash上面
< param name="wmode" value="opaque" >

延遲跳轉
<meta http-equiv=refresh content='3; url=javascript:window.close();'>

空連結
javascript:;

標題表格
<fieldset>
<legend>表格的說明</legend>
</fieldset>

細線表格
style="BORDER-COLLAPSE: collapse;"

滾動條顏色程式碼
BODY{
SCROLLBAR-FACE-COLOR: #FFFFFF;
SCROLLBAR-HIGHLIGHT-COLOR: #FFFFFF;
SCROLLBAR-SHADOW-COLOR: #FFFFFF;
SCROLLBAR-3DLIGHT-COLOR: #FFCBC8;
SCROLLBAR-ARROW-COLOR: #FFFFFF;
SCROLLBAR-TRACK-COLOR: #FFFFFF;
SCROLLBAR-DARKSHADOW-COLOR: #FFCBC8;
SCROLLBAR-BASE-COLOR: #FFFFFF
}

連續的英文或者一堆感嘆號!!!不會自動換行的問題
只要在CSS中定義瞭如下句子,可保網頁不會再被撐開了

table{table-layout: fixed;}
td{word-break: break-all; word-wrap:break-word;}

註釋一下:

1.第一條table{table-layout: fixed;},此樣式可以讓表格中有!!!(感嘆號)之類的字元時自動換行。

2.td{word-break: break-all},一般用這句這OK了,但在有些特殊情況下還是會撐開,因此需要再加上後面一句{word-wrap:break-word;}就可以解決。此樣式可以讓表格中的一些連續的英文單詞自動換行。

控制橫向和縱向滾動條的顯隱?
<body style="overflow-y:hidden"> 去掉x軸
<body style="overflow-x:hidden"> 去掉y軸
<body scroll="no">不顯

表格變色
<TD onmouseover="this.style.backgroundColor='#FFFFFF'"
onmouseout="this.style.backgroundColor=''"
style="CURSOR: hand">

普通iframe頁面
<iframe name="name" src="main.htm" width="450" height="287" scrolling="Auto" frameborder="0"></iframe>

iframe自適應高度
<iframe name="pindex" src="index.asp" frameborder=false scrolling="auto" width="100%" height="100%" frameborder=no onload="document.all['pindex'].style.height=pindex.document.body.scrollHeight" ></iframe>

iframe(嵌入式幀)自適應高度
填寫的嵌入地址一定要和本頁面在同一個站點上,否則會提示“拒絕訪問!”。對跨域引用有許可權問題,請查閱其他資料。
<iframe name="guestbook" src="gbook/index.asp" scrolling=no width="100%" height="100%" frameborder=no onload="document.all['guestbook'].style.height=guestbook.document.body.scrollHeight"></iframe>

字號縮放
越來越多的人長時間的泡網,眼鏡的普及率也越來越高,讓文字大點,讓更多的使用者看的更清楚。
<script type="text/javascript">
function doZoom(size)
{document.getElementById('zoom').style.fontSize=size+'px';}
</script>
<span id="zoom">需要指定大小的文字</span>
<a href="javascript:doZoom(16)">大</a> <a href="javascript:doZoom(14)">中</a> <a href="javascript:doZoom(12)">小</a>

select擋住div的解決方法
在div里加入下面的程式碼,根據需要調整就可以了。
<iframe src="javascript:false" scrolling="no" frameborder="0" style="z-index:-1;position:absolute; top:5px; left:2px;width:168;height:100px;">
</iframe>

跳轉選單新視窗
<select name="select" onchange="window.open(this.options[this.selectedIndex].value)">
<option value="http://www.microsoft.com/ie"> Internet Explorer</option>
<option value="http://www.microsoft.com"> Microsoft Home</option>
<option value="http://msdn.microsoft.com"> Developer Network</option>
</select>

flash透明選項
<param name="wmode" value="transparent">

記錄並顯示網頁的最後修改時間
<script language=JavaScript>
document.write("最後更新時間: " + document.lastModified + "")
</script>

讓IFRAME框架內的文件的背景透明
<iframe src="about:<body style='background:transparent'>" allowtransparency></iframe>

開啟視窗即最大化
<script language="JavaScript">
<!-- Begin
self.moveTo(0,0)
self.resizeTo(screen.availWidth,screen.availHeight)
// End -->
</script>

文字或圖片彈出指定大小的視窗
在body中加入
<script language="JavaScript" type="text/JavaScript">
function MM_openBrWindow(theURL,winName,features) {window.open(theURL,winName,features);}
</script>
彈出程式碼
<a href="#" target="_self" onClick="MM_openBrWindow('windows01.htm','','width=550,height=380')" width="550" height="380" border="0">圖片或文字</a>

flash按鈕加連結
on (press) {
getURL("http://www.******.com","_blank");
}

細線分隔線
<hr noshade size=0 color=#C0C0C0>

消除ie6自動出現的影象工具欄,設定 GALLERYIMG屬性為false或no .
<IMG SRC="mypicture.jpg" HEIGHT="100px" WIDTH="100px" GALLERYIMG="no">

禁止頁面正文內容被選取
<body oncontextmenu="return false" ondragstart="return false" onselectstart ="return false" onselect="document.selection.empty()" oncopy="document.selection.empty()" onbeforecopy="return
false"onmouseup="document.selection.empty()">

不能點右鍵,不用CTRL+A,不能複製作!
<body oncontextmenu="window.event.returnValue=false"
onkeypress="window.event.returnValue=false"
onkeydown="window.event.returnValue=false"
onkeyup="window.event.returnValue=false"
ondragstart="window.event.returnValue=false"
onselectstart="event.returnValue=false">
</body>

隨機變換背景圖象(一個可以重新整理心情的特效
<Script Language="JavaScript">
   image = new Array(4); //定義image為圖片數量的陣列
   image [0] = 'tu0.gif' //背景圖象的路徑
   image [1] = 'tu1.gif'
   image [2] = 'tu2.gif'
   image [3] = 'tu3.gif'
   image [4] = 'tu4.gif'
   number = Math.floor(Math.random() * image.length);
   document.write("<BODY BACKGROUND="+image[number]+">");
</Script>

flash載入影片
on (release)
{
loadMovie("1-01.swf", "_root.loaderclip");
}

圖片表單按鈕
<form id="form1" name="form1" method="post" action="">
<img src="login.gif" width="62" height="22" onclick="document.form1.submit()" />
</form>

左右陰影背景的CSS定義方法
body {
text-align:center;
background-repeat: repeat-y;
background-position: center;
background-image: url(../images/bg.jpg);
}

如何關閉層
<div id="Layer1"></div>
<a href="#" onClick="Layer1.style.display='none'">關閉層</a>

執行程式碼框
<script>
function Preview()
{var TestWin=open('');
TestWin.document.write(code.value);}
</script>
<textarea id=code cols=60 rows=15></textarea>
<br>
<button onclick=Preview() >執行</button>

給表格做連結
<table width="100%" onclick="window.open('http://www.******.com/&#39;, '_blank')" style="CURSOR:hand">
<tr>
<td height="100" bgcolor="f4f4f4">&nbsp;</td>
</tr>
</table>

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用來給連結文字或普通文字提示的。

<a href="#" Title="給連結文字提示">文字</a>
<p Title="給連結文字提示">文字</p>

<img src="圖片連結" alt="給圖片提示">

在同一頁面設定不同文字連結效果的樣式
<style type="text/css">
.green {COLOR: #309633}
.green A:link {COLOR: #309633; TEXT-DECORATION: none}
.green A:visited {COLOR: #309633; TEXT-DECORATION: none}
.green A:hover {COLOR: #309633; TEXT-DECORATION: underline}
.green A:active {COLOR: #309633; TEXT-DECORATION: none}
</style>
<a href="#" class="green">文字</a>

在建立與伺服器的連線時出錯。在連線到 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;

/// <summary>
/// 檢查型別許可權
/// </summary>
public void CheckClass()
{
Type type = this.GetType();
CheckPermissionAttribute att = (CheckPermissionAttribute)CheckPermissionAttribute.GetCustomAttribute(type, typeof(CheckPermissionAttribute));
if (att != null)
{
Check(att.AllMask);
}
}

/// <summary>
/// 檢查函式呼叫許可權
/// </summary>
/// <param name="methodName">方法名</param>
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");
.......
}
}