ASP.NET -- WebForm -- Cookie的使用html
Cookie是存在瀏覽器內存或磁盤上。java
1. Test3.aspx文件git

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test3.aspx.cs" Inherits="Test3" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </div> </form> </body> </html>
2. Test3.aspx.cs文件sql
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Test3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Request.Cookies["myProject"] != null) { //若是瀏覽器端發送給服務器端的Cookie有'myProject',則顯示'myProject'的Cookie值 Label1.Text = Request.Cookies["myProject"].Value; } else { //若是瀏覽器端發送給服務器端的Cookie沒有'myProject',則設置'myProject'的Cookie值 Response.Cookies["myProject"].Value = "Test3"; //沒有設置過時時間的cookie是存在瀏覽器內存中的,瀏覽器關閉就會消失 //設置了過時時間的cookie,關閉瀏覽器也不消失,是存在瀏覽器所使用的磁盤文件上的 //設置cookie的有效期爲一天, 該cookie一天後就會失效 //Response.Cookies["myProject"].Expires = DateTime.Now.AddDays(1); } } } }
3. 實現結果數據庫
(1) 首次訪問頁面,沒有cookie值,則設置cookie的值,服務器經過響應報文把要設置的cookie發送給瀏覽器。瀏覽器
(2) 再次訪問頁面時。瀏覽器會將cookie放在發送報文中,發送給服務器端。服務器端可將接收到的cookie值顯示出來。服務器
應用程序權限設計
咱們在開發系統的時候,常常會遇到系統須要權限控制,而權限的控制程度不一樣有不一樣的設計方案。cookie
- 1. 基於角色的權限設計
這種方案是最多見也是比較簡單的方案,不過一般有這種設計已經夠了,因此微軟就設計出這種方案的通用作法,這種方案對於每個操做不作控制,只是在程序中根據角色對是否具備操做的權限進行控制;這裏咱們就不作詳述asp.net
- 2. 基於操做的權限設計
這種模式下每個操做都在數據庫中有記錄,用戶是否擁有該操做的權限也在數據庫中有記錄,結構以下:ide
可是若是直接使用上面的設計,會致使數據庫中的UserAction這張表數據量很是大,因此咱們須要進一步設計提升效率,請看方案3
- 3. 基於角色和操做的權限設計
如上圖所示,咱們在添加了Role,和RoleACTION表,這樣子就能夠減小USERACTION中的記錄,而且使設計更靈活一點。
可是這種方案在用戶需求的考驗之下也可能顯得不夠靈活夠用,例如當用戶要求臨時給某位普通員工某操做權限時,咱們就須要新增長一種新的用戶角色,可是這種用戶角色是沒必要要的,由於它只是一種臨時的角色,若是添加一種角色還須要在收回此普通員工權限時刪除此角色,咱們須要設計一種更合適的結構來知足用戶對權限設置的要求。
- 4. 2,3組合的權限設計,其結構以下:
咱們能夠看到在上圖中添加了UserAction表,使用此表來添加特殊用戶的權限,改表中有一個字段HasPermission能夠決定用戶是否有某種操做的權限,改表中記錄的權限的優先級要高於UserRole中記錄的用戶權限。這樣在應用程序中咱們就須要經過UserRole和UserAction兩張表中的記錄判斷權限。
到這兒呢並不算完,有可能用戶還會給出這樣的需求:對於某一種action所操做的對象某一些記錄會有權限,而對於其餘的記錄沒有權限,好比說一個內容管理系統,對於某一些頻道某個用戶有修改的權限,而對於另一些頻道沒有修改的權限,這時候咱們須要設計更復雜的權限機制。
- 5. 對於同一種實體(資源)用戶能夠對一部分記錄有權限,而對於另一些記錄沒有權限的權限設計:
對於這樣的需求咱們就須要對每一種不一樣的資源建立一張權限表,在上圖中對Content和Channel兩種資源分別建立了UserActionContent和UserActionChannel表用來定義用戶對某條記錄是否有權限;這種設計是能夠知足用戶需求的可是不是很經濟,UserActionChannel和UserActionContent中的記錄會不少,而在實際的應用中並不是須要記錄全部的記錄的權限信息,有時候可能只是一種規則,好比說對於根Channel什麼級別的人有權限;這時候呢咱們就能夠定義些規則來判斷用戶權限,下面就是這種設計。
- 6. 涉及資源,權限和規則的權限設計
在這種設計下角色的概念已經沒有了,只須要Rule在程序中的類中定義用戶是否有操做某種對象的權限。
以上只是分析思路,若是有不對的地方,請你們指正。
權限設計文章彙總
如何設計網站權限系統?
https://www.zhihu.com/question/20313385/answer/118095995
個人轉載:https://www.cnblogs.com/hao-1234-1234/p/9850967.html
應用程序權限設計
http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permission.html#!comments
個人轉載 https://www.cnblogs.com/hao-1234-1234/p/8976332.html
個人sql語句實現:https://www.cnblogs.com/hao-1234-1234/p/8976643.html
如今有了Powdesigner能夠自動生成sql了,那時候不知道這個工具。
擴展RBAC用戶角色權限設計方案
https://www.cnblogs.com/zwq194/archive/2011/03/07/1974821.html
個人轉載:https://www.cnblogs.com/hao-1234-1234/p/9850910.html
java用戶角色權限設計
http://www.cnblogs.com/a7345678/archive/2008/09/25/1298838.html
個人轉載:https://www.cnblogs.com/hao-1234-1234/p/8976582.html
用戶、角色和權限開發
https://blog.csdn.net/u010004317/article/details/53996757
個人轉載:https://www.cnblogs.com/hao-1234-1234/p/8976603.html
asp.net後臺管理系統-登錄模塊-是否自動登錄
FormsAuthentication.SetAuthCookie(UserFlag, createPersistentCookie);
createPersistentCookie是否永久保存cookie
https://www.cnblogs.com/joeylee/p/3521131.html
C# 讀寫文件摘要
主要參考地址:http://www.javashuo.com/article/p-rdeudvii-p.html
首先下載微軟提供的工具:DsoFile (微軟官網下載傳送門)
讀寫自定義摘要信息(須要注意,自定義摘要信息只能添加一次,再添加會報錯,因此若是對應的name已經存在,只能採用修改的方式添加)

/// <summary> /// 檢測該文件屬性中是否已經存在指定的自定義屬性key /// </summary> /// <param name="file">本地的文件</param> /// <param name="key">自定義的key</param> /// <returns>存在key返回對應的值,不存在key返回string.empty</returns> private static string PropContains(string file, string key) { OleDocumentProperties odp = new OleDocumentProperties(); odp.Open(file); try { //因爲不能直接foreach,因此用了for循環 for (int i = 0; i < odp.CustomProperties.Count; i++) { if (odp.CustomProperties[i].Name == key) { return odp.CustomProperties[i].get_Value(); } } } catch (Exception ex) { LogUtil.Error($"{file} 文件處理出錯 ex:{ ex.ToString()}"); } finally { odp.Close(); } return string.Empty; } /// <summary> /// 修改自定義屬性的屬性值(存在則修改,不存在則添加) /// </summary> /// <param name="file">本地的文件</param> /// <param name="key">自定義的key</param> /// <returns>修改爲功返回true,不成功返回false</returns> private static void PropChange(string file, string key, string value) { OleDocumentProperties odp = new OleDocumentProperties(); odp.Open(file); try { //因爲不能直接foreach,因此用了for循環 for (int i = 0; i < odp.CustomProperties.Count; i++) { if (odp.CustomProperties[i].Name == key) { //爲指定自定義屬性修改值 odp.CustomProperties[i].set_Value(value); odp.Save(); return; } } //不存在指定屬性,則添加 odp.CustomProperties.Add(key, value); odp.Save(); } catch (Exception ex) { LogUtil.Error($"{file} 文件處理出錯 ex:{ ex.ToString()}"); } finally { odp.Close(); } }
除開自定義摘要,還有不少自帶的摘要信息能夠直接使用,以下:

[Guid("58968145-CF02-4341-995F-2EE093F6ABA3")] [TypeLibType(4288)] public interface SummaryProperties { [DispId(131073)] string Title { get; set; } [DispId(131074)] string Subject { get; set; } [DispId(131075)] string Author { get; set; } [DispId(131076)] string Keywords { get; set; } [DispId(131077)] string Comments { get; set; } [DispId(131078)] string Template { get; } [DispId(131079)] string LastSavedBy { get; set; } [DispId(131080)] string RevisionNumber { get; } [DispId(131081)] int TotalEditTime { get; } [DispId(131082)] dynamic DateLastPrinted { get; } [DispId(131083)] dynamic DateCreated { get; } [DispId(131084)] dynamic DateLastSaved { get; } [DispId(131085)] int PageCount { get; } [DispId(131086)] int WordCount { get; } [DispId(131087)] int CharacterCount { get; } [DispId(131088)] dynamic Thumbnail { get; } [DispId(131089)] string ApplicationName { get; } [DispId(131090)] int DocumentSecurity { get; } [DispId(131091)] string Category { get; set; } [DispId(131092)] string PresentationFormat { get; } [DispId(131093)] int ByteCount { get; } [DispId(131094)] int LineCount { get; } [DispId(131095)] int ParagraphCount { get; } [DispId(131096)] int SlideCount { get; } [DispId(131097)] int NoteCount { get; } [DispId(131098)] int HiddenSlideCount { get; } [DispId(131099)] int MultimediaClipCount { get; } [DispId(131100)] string Manager { get; set; } [DispId(131101)] string Company { get; set; } [DispId(131102)] int CharacterCountWithSpaces { get; } [DispId(131103)] bool SharedDocument { get; } [DispId(131104)] string Version { get; } [DispId(131105)] dynamic DigitalSignature { get; } }
越複雜 項目不可控程度越高
- 2,3組合的權限設計,其結構以下:
咱們能夠看到在上圖中添加了UserAction表,使用此表來添加特殊用戶的權限,改表中有一個字段HasPermission能夠決定用戶是否有某種操做的權限,改表中記錄的權限的優先級要高於UserRole中記錄的用戶權限。這樣在應用程序中咱們就須要經過UserRole和UserAction兩張表中的記錄判斷權限。
到這兒呢並不算完,有可能用戶還會給出這樣的需求:對於某一種action所操做的對象某一些記錄會有權限,而對於其餘的記錄沒有權限,好比說一個內容管理系統,對於某一些頻道某個用戶有修改的權限,而對於另一些頻道沒有修改的權限,這時候咱們須要設計更復雜的權限機制。
- 對於同一種實體(資源)用戶能夠對一部分記錄有權限,而對於另一些記錄沒有權限的權限設計:
對於這樣的需求咱們就須要對每一種不一樣的資源建立一張權限表,在上圖中對Content和Channel兩種資源分別建立了UserActionContent和UserActionChannel表用來定義用戶對某條記錄是否有權限;這種設計是能夠知足用戶需求的可是不是很經濟,UserActionChannel和UserActionContent中的記錄會不少,而在實際的應用中並不是須要記錄全部的記錄的權限信息,有時候可能只是一種規則,好比說對於根Channel什麼級別的人有權限;這時候呢咱們就能夠定義些規則來判斷用戶權限,下面就是這種設計。
User
Channel
Content
Action 都是基礎表
UserActionContent和UserActionChannel表 是關係表
Action 好理解 至關於 某一模塊
Channel 和 Content 又至關於什麼呢?