網頁中嵌入外部頁面的四種方法
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/');", "_self");
}
加入收藏:
on(release) {
getURL("javascript:window.external.AddFavorite('84design.com/" target="_blank">
}
狀態列動態顯示現在時間
<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/', '_blank')" style="CURSOR:hand">
<tr>
<td height="100" bgcolor="f4f4f4"> </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:模組資訊。
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");
.......
}
}