HttpModule與HttpHandler詳解

ASP.NET對請求處理的過程:
當請求一個*.aspx文件的時候,這個請求會被inetinfo.exe進程截獲,它判斷文件的后綴(aspx)之后,將這個請求轉交給 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll會通過http管道(Http PipeLine)將請求發送給ASPNET_WP.exe進程,在ASPNET_WP.exe進程中通過HttpRuntime來處理這個請求,處理完畢將結果返回客戶端。
??? inetinfo.exe進程:是www服務的進程,IIS服務和ASPNET_ISAPI.DLL都寄存在此進程中。
??? ASPNET_ISAPI.DLL:是處理.aspx文件的win32組件。其實IIS服務器是只能識別.html文件的,當IIS服務器發現被請求的文件是.aspx文件時,IIS服務器將其交給aspnet_isapi.dll來處理。
??? aspnet_wp.exe進程:ASP.NET框架進程,提供.net運行的托管環境,.net的CLR(公共語言運行時)就是寄存在此進程中。

ASP.NET Framework處理一個Http Request的流程:
??? HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->ASPNET_WP.exe-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()

ASP.NET 請求處理過程是基于管道模型的,這個管道模型是由多個HttpModule和HttpHandler組成,ASP.NET 把http請求依次傳遞給管道中各個HttpModule,最終被HttpHandler處理,處理完成后,再次經過管道中的HTTP模塊,把結果返回給客戶端。我們可以在每個HttpModule中都可以干預請求的處理過程。


注意:在http請求的處理過程中,只能調用一個HttpHandler,但可以調用多個HttpModule。
當請求到達HttpModule的時候,系統還沒有對這個請求真正處理,但是我們可以在這個請求傳遞到處理中心(HttpHandler)之前附加一些其它信息,或者截獲的這個請求并作一些額外的工作,也或者終止請求等。在HttpHandler處理完請求之后,我們可以再在相應的HttpModule中把請求處理的結果進行再次加工返回客戶端。

HttpModule
??? HTTP模塊是實現了System.Web.IhttpModule接口的類。
??? IHttpModule接口的聲明:
??????? public interface IHttpModule
??????? {
??????????? void Init (HttpApplication context);
??????????? void Dispose ();
??????? }
??????? Init 方法:系統初始化的時候自動調用,這個方法允許HTTP模塊向HttpApplication 對象中的事件注冊自己的事件處理程序。
??????? Dispose方法: 這個方法給予HTTP模塊在對象被垃圾收集之前執行清理的機會。此方法一般無需編寫代碼。
???
??? HTTP模塊可以向System.Web.HttpApplication對象注冊下面一系列事件:
??????? AcquireRequestState 當ASP.NET運行時準備好接收當前HTTP請求的對話狀態的時候引發這個事件。
??????? AuthenticateRequest 當ASP.NET 運行時準備驗證用戶身份的時候引發這個事件。
??????? AuthorizeRequest 當ASP.NET運行時準備授權用戶訪問資源的時候引發這個事件。
??????? BeginRequest 當ASP.NET運行時接收到新的HTTP請求的時候引發這個事件。
??????? Disposed 當ASP.NET完成HTTP請求的處理過程時引發這個事件。
??????? EndRequest 把響應內容發送到客戶端之前引發這個事件。
??????? Error 在處理HTTP請求的過程中出現未處理異常的時候引發這個事件。
??????? PostRequestHandlerExecute 在HTTP處理程序結束執行的時候引發這個事件。
??????? PreRequestHandlerExecute 在ASP.NET開始執行HTTP請求的處理程序之前引發這個事件。在這個事件之后,ASP.NET 把該請求轉發給適當的HTTP處理程序。
??????? PreSendRequestContent 在ASP.NET把響應內容發送到客戶端之前引發這個事件。這個事件允許我們在內容到達客戶端之前改變響應內容。我們可以使用這個事件給頁面輸出添加用于所有頁面的內容。例如通用菜單、頭信息或腳信息。
??????? PreSendRequestHeaders 在ASP.NET把HTTP響應頭信息發送給客戶端之前引發這個事件。在頭信息到達客戶端之前,這個事件允許我們改變它的內容。我們可以使用這個事件在頭信息中添加cookie和自定義數據。
??????? ReleaseRequestState 當ASP.NET結束所搜有的請求處理程序執行的時候引發這個事件。
??????? ResolveRequestCache 我們引發這個事件來決定是否可以使用從輸出緩沖返回的內容來結束請求。這依賴于Web應用程序的輸出緩沖時怎樣設置的。
??????? UpdateRequestCache 當ASP.NET完成了當前的HTTP請求的處理,并且輸出內容已經準備好添加給輸出緩沖的時候,引發這個事件。這依賴于Web應用程序的輸出緩沖是如何設置的。

??? 上面這么多的事件,我們看起來可能會有些眼暈,但沒關系,下面一步一步地看。
??? HttpModule生命周期示意圖


??? 下面是事件的觸發順序:


??? BeginRequest和PreRequestHandlerExecute之間的事件是在服務器執行HttpHandler處理之前觸發。
??? PostRequestHandlerExecute和PreSendRequestContent之間的事件是在服務器執行Handler處理之后觸發。
???
??? 下面我們看一下如何使用HttpModule來實現我們日常的應用:
??????? HttpModule通過在某些事件中注冊,把自己插入ASP.NET請求處理管道。當這些事件發生的時候,ASP.NET調用對相應的HTTP模塊,這樣該模塊就能處理請求了。
?????? 1、向每個頁面動態添加一些備注或說明性的文字:
??????????? 有的網站每一個頁面都會彈出一個廣告或在每個頁面都以注釋形式(<!-- -->)加入網站的版權信息。如果在每個頁面教編寫這樣的JS代碼的話,對于大一點的網站,這種JS代碼的編寫與維護可是一個很繁瑣枯燥的工作。
??????????? 有了HttpModule我們就可以很簡單地解決這個問題了。HttpModule是客戶端發出請求到客戶端接收到服務器響應之間的一段必經之路。我們完全可以在服務器處理完請求之后,并在向客戶端發送響應文本之前這段時機,把這段注釋文字添加到頁面文本之后。這樣,每一個頁面請求都會被附加上這段注釋文字。
??????????? 這段代碼究竟該在哪個事件里實現呢? PostRequestHandlerExecute和PreSendRequestContent之間的任何一個事件都可以,但我比較喜歡在EndRequest事件里編寫代碼。
??????????? 第一步:創建一個類庫ClassLibrary831。
??????????? 第二步:編寫一個類實現IHttpModule接口
???????????????class TestModule:IHttpModule
??????????????? {
??????????????????? public void Dispose()
??????????????????? {
??????????????????? }
??????????????????? public void Init(HttpApplication context)
??????????????????? {
??????????????????? }
??????????????? }
??????????? 第三步:在Init事件中注冊EndRequest事件,并實現事件處理方法
?????????????? class TestModule:IHttpModule
??????????????? {
??????????????????? public void Dispose(){}
??????????????????? public void Init(HttpApplication context)
??????????????????? {
??????????????????????? context.EndRequest += new EventHandler(context_EndRequest);
??????????????????? }
??????????????????? void context_EndRequest(object sender, EventArgs e)
??????????????????? {
??????????????????????? HttpApplication ha = (HttpApplication)sender;
??????????????????????? ha.Response.Write("<!--這是每個頁面都會動態生成的文字。--grayworm-->");
??????????????????? }
??????????????? }
??????????? 第四步:在Web.Conofig中注冊一下這個HttpModule模塊
??????????
<httpModules>
?????????? <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>
????????? </httpModules>
????????? name:模塊名稱,一般是類名
????????? type:有兩部分組成,前半部分是命名空間和類名組成的全名,后半部分是程序集名稱,如果類是直接放在App_Code文件夾中,那程序名稱是App_Code。
??????????????? 這樣在Web站點是添加該類庫的引用后,運行每個頁面,會發現其源文件中都會加入“<!--這是每個頁面都會動態生成的文字。 --grayworm-->”這句話。同樣的方法你也可以在其中加入JS代碼。
?????? 2、身份檢查
??????????? 大家在作登錄時,登錄成功后,一般要把用戶名放在Session中保存,在其它每一個頁面的Page_Load事件中都檢查Session中是否存在用戶名,如果不存在就說明用戶未登錄,就不讓其訪問其中的內容。
??????????? 在比較大的程序中,這種做法實在是太笨拙,因為你幾乎要在每一個頁面中都加入檢測Session的代碼,導致難以開發和維護。下面我們看看如何使用HttpModule來減少我們的工作量
??????????? 由于在這里我們要用到Session中的內容,我們只能在AcquireRequestState和PreRequestHandlerExecute事件中編寫代碼,因為在HttpModule中只有這兩事件中可以訪問Session。這里我們選擇PreRequestHandlerExecute事件編寫代碼。
??????????? 第一步:創建一個類庫ClassLibrary831。
??????????? 第二步:編寫一個類實現IHttpModule接口
??????????????? class TestModule:IHttpModule
??????????????? {
??????????????????? public void Dispose()
??????????????????? {
??????????????????? }
??????????????????? public void Init(HttpApplication context)
??????????????????? {
??????????????????? }
??????????????? }
??????????? 第三步:在Init事件中注冊PreRequestHandlerExecute事件,并實現事件處理方法
?????????????? class AuthenticModule:IHttpModule
??????????????? {
??????????????????? public void Dispose(){}
??????????????????? public void Init(HttpApplication context)
??????????????????? {
??????????????????????? context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
??????????????????? }
??????????????????? void context_PreRequestHandlerExecute(object sender, EventArgs e)
??????????????????? {
??????????????????????? HttpApplication ha = (HttpApplication)sender;
??????????????????????? string path = ha.Context.Request.Url.ToString();
??????????????????????? int n = path.ToLower().IndexOf("Login.aspx");
??????????????????????? if (n == -1) //是否是登錄頁面,不是登錄頁面的話則進入{}
??????????????????????? {
??????????????????????????? if (ha.Context.Session["user"] == null) //是否Session中有用戶名,若是空的話,轉向登錄頁。
??????????????????????????? {
??????????????????????????????? ha.Context.Response.Redirect("Login.aspx?source=" + path);
??????????????????????????? }
??????????????????????? }
??????????????????? }
??????????????? }
??????????? 第四步:在Login.aspx頁面的“登錄”按鈕中加入下面代碼
??????????????? protected void Button1_Click(object sender, EventArgs e)
??????????????? {
??????????????????? if(true)??? //判斷用戶名密碼是否正確
??????????????????? {
??????????????????????? if (Request.QueryString["source"] != null)
??????????????????????? {
??????????????????????????? string s = Request.QueryString["source"].ToLower().ToString();?? //取出從哪個頁面轉來的
??????????????????????????? Session["user"] = txtUID.Text;
??????????????????????????? Response.Redirect(s); //轉到用戶想去的頁面
??????????????????????? }
??????????????????????? else
??????????????????????? {
??????????????????????????? Response.Redirect("main.aspx");??? //默認轉向main.aspx
??????????????????????? }
??????????????????? }
??????????????? }
??????????? 第五步:在Web.Conofig中注冊一下這個HttpModule模塊
??????????
<httpModules>
?????????? <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>
????????? </httpModules>
?????? 3、多模塊的操作
??????????? 如果定義了多個HttpModule,在web.config文件中引入自定義HttpModule的順序就決定了多個自定義HttpModule在處理一個HTTP請求的接管順序。
????????????

HttpHandler
??? HttpHandler是HTTP請求的處理中心,真正地對客戶端請求的服務器頁面做出編譯和執行,并將處理過后的信息附加在HTTP請求信息流中再次返回到HttpModule中。
??? HttpHandler與HttpModule不同,一旦定義了自己的HttpHandler類,那么它對系統的HttpHandler的關系將是“覆蓋”關系。
??? IHttpHandler接口聲明
??? public interface IHttpHandler
??? {
??????? bool IsReusable { get; }
??????? public void ProcessRequest(HttpContext context); //請求處理函數
??? }
???
??? 示例:把硬盤上的圖片以流的方式寫在頁面上
??????? class TestHandler : IHttpHandler
??????? {
??????????? public void ProcessRequest(HttpContext context)
??????????? {
??????????????? FileStream fs = new FileStream(context.Server.MapPath("worm.jpg"), FileMode.Open);
??????????????? byte[] b = new byte[fs.Length];
??????????????? fs.Read(b, 0, (int)fs.Length);
??????????????? fs.Close();
??????????????? context.Response.OutputStream.Write(b, 0, b.Length);
??????????? }
??????????? public bool IsReusable
??????????? {
??????????????? get
??????????????? {
??????????????????? return true;
??????????????? }
??????????? }
??????? }
??????? Web.Config配置文件
????? <httpHandlers>
?????? <add verb="*" path="*" type="ClassLibrary831.TestHandler,ClassLibrary831"></add>
????? </httpHandlers>
?????????? Verb屬性:指定了處理程序支持的HTTP動作。*-支持所有的HTTP動作;“GET”-支持Get操作;“POST”-支持Post操作;“GET, POST”-支持兩種操作。
Path屬性:指定了需要調用處理程序的路徑和文件名(可以包含通配符)。“*”、“*.aspx”、“showImage.aspx”、“test1.aspx,test2.aspx”
Type屬性:用名字空間、類名稱和程序集名稱的組合形式指定處理程序或處理程序工廠的實際類型。ASP.NET運行時首先搜索bin目錄中的DLL,接著在GAC中搜索。
??????? 這樣程序運行的效果是該網站的任何一個頁面都會顯示worm.jpg圖片。如何只讓一個頁面(default21.aspx)執行HttpHandler 中的ProcessRequest方法呢?最簡單的辦法是在Web.Config文件中把path配置信息設為default21.aspx。
??????? 根據這個例子大家可以考慮一下如何編寫&ldquoldquo;驗證碼”了。

IHttpHandler工廠
??? IHttpHandlerFactory的作用是對IHttpHandler進行管理。工廠的作用請見http://hi.baidu.com/grayworm/blog/item/4a832160f8c9de46eaf8f8c1.html"
??? IHttpHandlerFactory接口的聲明:
??????? public interface IHttpHandlerFactory
??????? {
??????????? IHttpHandler GetHandler (HttpContext context,string requestType,string url,string pathTranslated);
??????????? void ReleaseHandler (IHttpHandler handler);
??????? }
?????? GetHandler返回實現IHttpHandler接口的類的實例,ReleaseHandler使工廠可以重用現有的處理程序實例。
??? 示例:兩個用IHttpHandlerFactory來實現對不同HttpHandler的調用。
??? 有兩個HttpHandler:將圖片顯示在頁面上的HttpHandler和生成驗證碼的Handler
??????? //將圖片顯示在頁面上的Handler
??????? class TestHandler : IHttpHandler
??????? {
??????????? public void ProcessRequest(HttpContext context)
??????????? {
??????????????? FileStream fs = new FileStream(context.Server.MapPath("worm.jpg"), FileMode.Open);
??????????????? byte[] b = new byte[fs.Length];
??????????????? fs.Read(b, 0, (int)fs.Length);
??????????????? fs.Close();
??????????????? context.Response.OutputStream.Write(b, 0, b.Length);
??????????? }
??????????? public bool IsReusable
??????????? {
??????????????? get
??????????????? {
??????????????????? return true;
??????????????? }
??????????? }
??????? }
??????? //生成驗證碼的Handler
??????? class CodeHandler:IHttpHandler
??????? {
??????????? public bool IsReusable
??????????? {
??????????????? get
??????????????? {
??????????????????? return true;
??????????????? }
??????????? }
??????????? public void ProcessRequest(HttpContext context)
??????????? {
??????????????? Image b = new Bitmap(50,20);
??????????????? Graphics g = Graphics.FromImage(b);
??????????????? SolidBrush sb = new SolidBrush(Color.White);
??????????????? Font f = new Font("宋體", 12);
??????????????? string str = "";
??????????????? Random r = new Random();
??????????????? for (int i = 0; i < 4; i++)
??????????????? {
??????????????????? str += r.Next(10);
??????????????? }
??????????????? g.DrawString(str,f,sb,0,0);
??????????????? b.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
??????????? }
??????? }
???????? IHttpHandler工廠
???????? class TestHandlerFactory : IHttpHandlerFactory
???????? {
??????????? public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
??????????? {
???????????????
??????????????? string fname = url.Substring(url.IndexOf('/') + 1);
??????????????? while (fname.IndexOf('/') != -1)
??????????????????? fname = fname.Substring(fname.IndexOf('/') + 1);
??????????????? string cname = fname.Substring(0, fname.IndexOf('.'));
??????????????? string className ="";

??????????????? className = "ClassLibrary831.CodeHandler";
??????????????? object h = null;
??????????????? try
??????????????? {
??????????????????? //h = new TestHandler();
??????????????????? h = Activator.CreateInstance(Type.GetType(className));
??????????????? }
??????????????? catch (Exception e)
??????????????? {
??????????????????? throw new HttpException("工廠不能為類型" + cname + "創建實例。", e);
??????????????? }
??????????????? return (IHttpHandler)h;
??????????? }
??????????? public void ReleaseHandler(IHttpHandler handler)
??????????? {
??????????? }
???????? }(車延祿)
??????? 配置文件
??? <httpHandlers>
??? <add verb="*" path="default21.aspx,default22.aspx" type="ClassLibrary831.TestHandlerFactory,ClassLibrary831"></add>
?? </httpHandlers>

?? 這樣TestHandlerFactory就會根據請求的不同頁面執行不同的HttpHandler處理程序了。

HttpHandler使用會話
??? 如果要在處理程序中使用Session,那必須把該HttpHandler實現IRequiresSessionState接口,,IRequiresSessionState接口是個空接口,它沒有抽象方法,只是一個標記。下面是一個文件上傳的例子

1、先引用System.Web.SessionState這個命名空間,
2、如果是要在HttpHandler中讀取Session的內容,就要在實現IHttpHandler的類中同時實現IReadOnlySessionState這個接口。
3、如果是要在HttpHandler中讀寫Session的內容,就要在實現IHttpHandler的類中同時實現IRequiresSessionState
??
??這樣就可以在自定義的HttpHandler 中正常的使用Session了。

/// <summary>
/// 上傳文件事件;
/// </summary>
public class Upload : IHttpHandler, IRequiresSessionState
{???
??? public Upload()
??? {
??? }

??? #region IHttpHandler Members

??? public bool IsReusable
??? {
??????? get { return true; }
??? }

??? public void ProcessRequest(HttpContext context)
??? {
??????? string temp = context.Session["temp"].ToString();

??????? string EncryptString = context.Request.QueryString["User"];
???????
??????? if (temp!="" && context.Request.Files.Count > 0 )
??????? {
??
??????????? string uploadPath = context.Server.MapPath(context.Request.ApplicationPath + "/Upload/" +temp);
???if (Directory.Exists(uploadPath) == false)//不存在該目錄時自動創建一個目錄
?????????? ? {
?????????????? ?? Directory.CreateDirectory(uploadPath);
?????????? ? }
??????????
??????????? for(int j = 0; j < context.Request.Files.Count; j++)
??????????? {
??????????????
??????????????? HttpPostedFile uploadFile = context.Request.Files[j];
??????????????
??????????????? if (uploadFile.ContentLength > 0)
??????????????? {
???????????????????
??????????????????? uploadFile.SaveAs(Path.Combine(uploadPath, uploadFile.FileName));???????
??????????????? }???????????????
??????????? }
??????? }
???????
??????? //HttpContext.Current.Response.Write(" ");
??????
??? }

??? #endregion
}


后臺代碼:

public partial class _Default : System.Web.UI.Page
{
??? protected void Page_Load(object sender, EventArgs e)
??? {
??????? string jscript = "function UploadComplete(){" + ClientScript.GetPostBackEventReference(LinkButton1, "") + "};";
??????? Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "FileCompleteUpload", jscript, true);
??????? Session["temp"] = "yekin";
??????? FormsIdentity cIdentity = User.Identity as FormsIdentity;
??????? string encryptString = Session["temp"].ToString();
??????? flashUpload.QueryParameters = string.Format("User={0}", encryptString);???????
??? }

??? protected void LinkButton1_Click(object sender, EventArgs e)
??? {
?
?
??Response.Write("<script>alert('恭喜您,上傳成功!');</script>");
?
???????
??????? // MyGrid.DataBind();
??? }
}

?

轉載于:https://www.cnblogs.com/caoyc/p/6409062.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372962.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372962.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372962.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【iOS開發】---- 強大的UI修改工具 UIAppearance-有圖片效果

iOS5及其以后提供了一個比較強大的工具UIAppearance&#xff0c;可以輕松的統一你的界面&#xff0c;它提供如下兩個方法&#xff1a; (id)appearance (id)appearanceWhenContainedIn:(Class <>)ContainerClass,... 第一個方法是統一全部改&#xff0c;比如你設置UINav…

7月9日王者榮耀服務器維護,王者榮耀 7月9日體驗服停機更新公告

親愛的召喚師&#xff1a;為了增加版本的穩定性&#xff0c;我們計劃在2021年7月9日16:00-17:00對《王者榮耀》體驗服進行停機維護。【更新時間】7月9日16:00-17:00(15:30關閉PVP)【更新方式】停機更新【更新范圍】王者榮耀修煉之地體驗服【下載地址】體驗服更新完畢后&#xf…

使用Jetty設置JNDI(嵌入式)

我在開發工作區上運行嵌入式Jetty&#xff0c;從而節省了一些編譯和部署惡性循環的時間。 我與Jetty的合作不多&#xff0c;易用性使我著迷于它。 我需要設置JNDI才能檢索與數據庫相關的活動的連接池。 盡管某些地方有完整的文檔&#xff0c;但大多數都是分散的。 因此&#xf…

交華為換機access配置_華為交換機Hybrid接口及基礎配置

一、回顧VLANVLAN基本概念VLAN即虛擬局域網&#xff0c;是將一個物理的LAN在邏輯上劃分成多個廣播域(多個VLAN)的通信技術。VLAN內的主機間可以直接通信&#xff0c;而VLAN間不能直接互通&#xff0c;從而將廣播報文限制在一個VLAN內。由于VLAN之間的隔離&#xff0c;所以一些類…

HttpClient使用之下載遠程服務器中的文件(注意目錄遍歷漏洞)

參考文獻&#xff1a; http://bbs.csdn.net/topics/390952011 http://blog.csdn.net/ljj_9/article/details/53306468 1.下載地址 http://hc.apache.org/downloads.cgi Apache-》Projects-》HttpComponents 2.DownloadServlet 1 package com.servlet;2 3 import java.io.Buffer…

HDOJ-1263

水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5303 Accepted Submission(s): 2022 Problem Description夏天來了~~好開心啊,呵呵,好多好多水果~~Joe經營著一個不大的水果店.他認為生存之道就是經營最受顧…

django ajax form表單,Django學習系列之Form表單和ajax(示例代碼)

昵 稱&#xff1a;生 日&#xff1a;性 別&#xff1a; 男 女地 址&#xff1a;手 機 號&#xff1a;郵 箱&#xff1a;[修改]{% csrf_token %}$(\#jsEditUserBtn\).on(\click\, function(){var _self $(this),$jsEditUserForm $(\#…

git push 的符號筆有什么用_如何同步多個 git 遠程倉庫

點擊上方“后端技術精選”&#xff0c;選擇“置頂公眾號”技術文章第一時間送達&#xff01;作者&#xff1a;taadismy.oschina.net/taadis/blog/3073220題外話&#xff0c;開發中遇到問題或者學習新技術時缺少交流環境&#xff0c;可以點擊加入【后端技術交流群】日常需求以前…

Java EE重新審視設計模式:觀察者

除了以多種語言和許多應用程序實現之外&#xff0c;Observer Pattern自1.0版以來一直是Java的一部分。 觀察者模式也是好萊塢原則的良好實施。 就像好萊塢的特工喜歡回調候選人以代替某個職位&#xff0c;而不是每天被要求詢問可用工作一樣&#xff0c;大多數服務器端資源&…

POI搜索簡介

用戶輸入——用戶輸出-----------------------------------------------------------而POI搜索引擎&#xff0c;需要做的就是拿到輸入條件&#xff0c;給出用戶比較滿意的結果。用戶角度&#xff1a;輸入&#xff1a;盡量簡單&#xff0c;且符合心意輸入時的假設&#xff1a;假…

2、Spring的 IoC詳解(第一個Spring程序)

Spring是為了解決企業應用開發的復雜性而創建的一個輕量級的控制反轉&#xff08;IoC&#xff09;和面向切面&#xff08;AOP&#xff09;的容器框架。在這句話中重點有兩個&#xff0c;一個是IoC&#xff0c;另一個是AOP。今天我們講第一個IoC。 一. IoC理論的背景 我們都知道…

排除服務器簡單系統故障方法,引導CD排除服務器故障方法有哪些?

盡管Linux系統以穩定可靠著稱&#xff0c;但由于硬件問題有時仍會崩潰/或無法引。針對這一問題&#xff0c;最好的解決辦法就是使用Linux系統引導CD。為了方便讀者&#xff0c;筆者在下面列出了安裝Red Hat Linux 8。0的最必須步驟。為安裝過程作筆記在Red Hat Linux系統典型安…

js 獲取father_(原創)Node.JS實戰26:強大的工作池。收藏吧!你一定會用的到。...

在實際項目中&#xff0c;如果遇到需要大計算量的操作&#xff0c;按需fork&#xff08;分叉&#xff09;其實不是一個好的選擇。因為fork的子進程也是V8&#xff08;NodeJS的核心引擎&#xff09;的新實例&#xff0c;每創建一個新實例&#xff0c;需要約30毫秒啟動時間&#…

具有ReadWriteLock的Java并發

編寫多線程Java應用程序并不是小菜一碟。 必須格外小心&#xff0c;因為同步不良會使您的應用程序一s不振。 JVM堆由所有線程共享。 如果多個線程需要同時使用相同的對象或靜態類變量&#xff0c;則必須謹慎管理對共享數據的線程訪問。 從1.5版開始&#xff0c;JSDK中包含了在并…

修復steam服務器失敗,steam服務器鏈接失敗

steam服務器鏈接失敗 內容精選換一換當NTP服務器異常時產生該告警。當NTP服務器異常消除時&#xff0c;該告警恢復。主OMS節點配置的NTP服務器異常&#xff0c;可能會導致主OMS節點與外部服務器不能同步時間&#xff0c;集群時間可能會產生飄移。NTP服務器網絡異常。與NTP服務器…

qemu-kvm簡單使用

qemu-kvm主要有以下幾個選項: -snapshot: 創建快照-m: 指定內存大小-smp: 指定處理器個數-cpu: 指定CPU類型-name: 設置虛擬機名稱-vnc: 使用vnc連接-boot: 指定啟動相關的選項-net: 指定網卡相關的選項-drive: 指定硬盤/光盤相關的選項qemu-kvm -m 128 -name first -smp 2 -dr…

將jar添加到發布目錄_第32批免購置稅新能源車型目錄發布;通用BEV3平臺將入華...

1、第32批免購置稅新能源車型目錄發布&#xff0c;幾何X/理想ONE等283款車型入選6月2日&#xff0c;工信部發布《免征車輛購置稅的新能源汽車車型目錄(第三十二批)》&#xff0c;共有283款新能源車型入選。其中新能源乘用車方面包括&#xff0c;一汽大眾Q2L/e-BORA、東風風神E7…

HPROF –內存泄漏分析教程

本文將為您提供有關如何通過生成和分析Sun HotSpot JVM HPROF堆轉儲文件來分析JVM內存泄漏問題的教程。 一個現實的案例研究將用于此目的&#xff1a;Weblogic 9.2內存泄漏影響Weblogic Admin服務器。 環境規格 Java EE服務器&#xff1a;Oracle Weblogic Server 9.2 MP1 中…

mq服務器與客戶端消息同步,使用 ActiveMQ 實現JMS 異步調用

目錄簡介服務之間的同步調用&#xff0c;可以使用 HTTP 或 RPC 來完成&#xff0c;但并非所有的調用都需要同步&#xff0c;有些場景下&#xff0c;當客戶端調用服務端時&#xff0c;并不需要等待服務端做出響應&#xff0c;此時就應該使用異步調用。異步調用的常用方式是基于 …

多個數字數組_七個問題幫助初學者深入理解Java數組

短文漲姿勢&#xff0c;看了不白看&#xff0c;不關注等啥&#xff1f;幾乎所有的高級語言當中&#xff0c;都提供了一種叫做”數組”的東西&#xff0c;Java語言當然也不例外。我們通過數組可以很方便的存儲和管理一組數據。因為在Java語言當中使用數組非常的方便&#xff0c;…