整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          JS文件中獲取contextPath的方法

          Springboot項目的application.properites中配置了server.servlet.context-path=/demo,有時候會報錯404,分析原因是訪問路徑問題。

          首先定義函數(shù)

          function getContextPath() {
             var pathName = document.location.pathname;
             var index = pathName.substr(1).indexOf("/");
             var result = pathName.substr(0,index+1);
             return result;
          }

          在引用的時候,路徑前加上getContextPath(),例如:

          端在做Ajax請求時,

          如果用Jquery提供的Ajax,那么每次都要設定URL的部署名ContextPath。

          項目規(guī)模起來的話,為了適當減少工作量。

          同時避免個別開發(fā)人員不調(diào)用共通方法,直接把部署名拼到URL上。

          對Ajax的設定做如下修正。可以解決上述的兩個問題。

          // ================================================
          // HTML的文檔對象模型 (DOM)加載完后,執(zhí)行的內(nèi)容
          // ================================================
          $(function() {
              //ajax初始化
              $.ajaxSetup({
                  type: "POST",
                  dataType: "json",
                  contentType: "application/json",
                  async: false,
                  extraUrl: null,
                  extraBeforeSend: null,
                  beforeSend: function(jqXHR, settings) {
                      if (settings.type && settings.type.toUpperCase() == "POST") {
                          // 設置HTTP請求頭部
                          var headerName = $("meta[name='_csrf_header']").attr("content");
                          var tokenValue = $("meta[name='_csrf']").attr("content");
                          jqXHR.setRequestHeader(headerName, tokenValue);
                      }
                      // 設定部署名ContextPath
                      if (($.trim(settings.extraUrl)).length > 0) {
                          if (settings.type.toUpperCase() == "GET" && settings.url.indexOf('?') > 0) {
                              settings.url = getContextPath() + settings.extraUrl + settings.url.substring(settings.url.indexOf('?'));
                          } else {
                              settings.url = getContextPath() + settings.extraUrl;
                          }
                      }
                      if (typeof settings.extraBeforeSend === "function") {
                          settings.extraBeforeSend.call(this, jqXHR, settings);
                      }
                  }
              });
          });

          共通方法getContextPath()的內(nèi)容

              <script type="text/javascript" th:inline="javascript">
                  /*<![CDATA[*/
                  thContextPath = /*[[@{/}]]*/'';
                  /*]]>*/
                  function getContextPath() {
                      return thContextPath;
                  }
              </script>

          或者

          //HTML代碼
          <input type="hidden" id="contextPath" th:value="@{/}" />
           //js代碼
          function getContextPath() {
              var contextPath = document.getElementById("contextPath");
              if (contextPath == null) return "/";
              return contextPath.value;
          }

          調(diào)用Ajax的方法

          SP.NET Core 應用通過 IHttpContextAccessor 接口及其默認實現(xiàn) HttpContextAccessor 訪問 HttpContext。 只有在需要訪問服務內(nèi)的 HttpContext 時,才有必要使用 IHttpContextAccessor。

          通過 Razor Pages 使用 HttpContext

          Razor Pages PageModel 公開 HttpContext 屬性:

          C#復制

          public class AboutModel : PageModel
          {
              public string Message { get; set; }
          
              public void OnGet()
              {
                  Message = HttpContext.Request.PathBase;
              }
          }
          

          相同的屬性可在相應的 Razor 頁面視圖中使用

          CSHTML復制

          @page
          @model AboutModel
          @{
              var message = HttpContext.Request.PathBase;
              
              ...
          }
          

          在 MVC 的 Razor 視圖中使用 HttpContext

          MVC 模式中的 Razor 視圖通過視圖上的 RazorPage.Context 屬性公開 HttpContext。 下面的示例使用 Windows 身份驗證檢索 Intranet 應用中的當前用戶名:

          CSHTML復制

          @{
              var username = Context.User.Identity.Name;
              
              ...
          }
          

          通過控制器使用 HttpContext

          控制器公開 ControllerBase.HttpContext 屬性:

          C#復制

          public class HomeController : Controller
          {
              public IActionResult About()
              {
                  var pathBase = HttpContext.Request.PathBase;
          
                  ...
          
                  return View();
              }
          }
          

          通過中間件使用 HttpContext

          使用自定義中間件組件時,HttpContext 傳遞到 Invoke 或 InvokeAsync 方法,在中間件配置后可供訪問:

          public class MyCustomMiddleware
          {
              public Task InvokeAsync(HttpContext context)
              {
                  ...
              }
          }
          

          通過自定義組件使用 HttpContext

          對于需要訪問 HttpContext 的其他框架和自定義組件,建議使用內(nèi)置的依賴項注入容器來注冊依賴項。 依賴項注入容器向任意類提供 IHttpContextAccessor,以供類在自己的構(gòu)造函數(shù)中將它聲明為依賴項:

          public void ConfigureServices(IServiceCollection services)
          {
               services.AddControllersWithViews();
               services.AddHttpContextAccessor();
               services.AddTransient<IUserRepository, UserRepository>();
          }
          

          如下示例中:

          • UserRepository 聲明自己對 IHttpContextAccessor 的依賴。
          • 當依賴項注入容器解析依賴鏈并創(chuàng)建 UserRepository 實例時,就會注入依賴項。
          public class UserRepository : IUserRepository
          {
              private readonly IHttpContextAccessor _httpContextAccessor;
          
              public UserRepository(IHttpContextAccessor httpContextAccessor)
              {
                  _httpContextAccessor = httpContextAccessor;
              }
          
              public void LogCurrentUser()
              {
                  var username = _httpContextAccessor.HttpContext.User.Identity.Name;
                  service.LogAccessRequest(username);
              }
          }
          

          從后臺線程訪問 HttpContext

          HttpContext 不是線程安全型。 在處理請求之外讀取或?qū)懭?HttpContext 的屬性可能會導致 NullReferenceException。

          備注

          如果應用生成偶發(fā)的 NullReferenceException 錯誤,請評審啟動后臺處理的部分代碼,或者在請求完成后繼續(xù)處理的部分代碼。 查找諸如將控制器方法定義為 async void 的錯誤。

          要使用 HttpContext 數(shù)據(jù)安全地執(zhí)行后臺工作,請執(zhí)行以下操作:

          • 在請求處理過程中復制所需的數(shù)據(jù)。
          • 將復制的數(shù)據(jù)傳遞給后臺任務。
          • 請勿在并行任務中引用 HttpContext 數(shù)據(jù)。 在開始并行任務之前,從上下文中提取所需的數(shù)據(jù)。

          要避免不安全代碼,請勿將 HttpContext 傳遞給執(zhí)行后臺工作的方法。 而是傳遞所需要的數(shù)據(jù)。 在以下示例中,調(diào)用 SendEmailCore,開始發(fā)送電子郵件。 將 correlationId 傳遞到 SendEmailCore,而不是 HttpContext。 代碼執(zhí)行不會等待 SendEmailCore 完成:

          public class EmailController : Controller
          {
              public IActionResult SendEmail(string email)
              {
                  var correlationId = HttpContext.Request.Headers["x-correlation-id"].ToString();
          
                  _ = SendEmailCore(correlationId);
          
                  return View();
              }
          
              private async Task SendEmailCore(string correlationId)
              {
                  ...
              }
          }
          

          Blazor 和共享狀態(tài)

          Blazor 服務器應用位于服務器內(nèi)存中。 這意味著同一進程中托管了多個應用。 對于每個應用會話,Blazor 會啟動具有其自己的 DI 容器作用域的線路。 這意味著,每個 Blazor 會話的作用域內(nèi)服務都是唯一的。

          警告

          我們不建議同一服務器上的應用共享使用單一實例服務的狀態(tài),除非采取了極其謹慎的措施,因為這可能會帶來安全漏洞,如跨線路泄露用戶狀態(tài)。

          如果有狀態(tài)的單一實例服務是專門為 Blazor 應用設計的,則可以在該應用中使用這些服務。 例如,假設用戶無法控制使用哪些緩存密鑰,則可以將內(nèi)存緩存用作單一實例,因為它需要一個密鑰來訪問給定的條目。

          另外,出于安全原因,不得在 Blazor 應用中使用 IHttpContextAccessor 。 Blazor 應用在 ASP.NET Core 管道的上下文之外運行。 HttpContext 既不保證在 IHttpContextAccessor 中可用,也不保證它會保留啟動了 Blazor 應用的上下文。

          若要向 Blazor 應用傳遞請求狀態(tài),建議在初次呈現(xiàn)應用時通過傳遞到根組件的參數(shù)進行傳遞:

          • 使用要傳遞到 Blazor 應用的所有數(shù)據(jù)定義類。
          • 使用目前可用的 HttpContext 在 Razor 頁中填充該數(shù)據(jù)。
          • 將數(shù)據(jù)作為傳遞給根組件(應用)的參數(shù)傳遞給 Blazor 應用。
          • 在根組件中定義一個參數(shù),用于保存即將傳遞給應用的數(shù)據(jù)。
          • 在應用中使用用戶特定的數(shù)據(jù);或者,將該數(shù)據(jù)復制到 OnInitializedAsync 中的作用域內(nèi)的服務,以便可以跨應用使用該數(shù)據(jù)。

          主站蜘蛛池模板: 狠狠色婷婷久久一区二区| 国产主播在线一区| 日韩精品一区二区三区国语自制 | 日韩在线一区二区三区免费视频| 国产高清在线精品一区二区| 成人精品视频一区二区| 蜜桃无码一区二区三区| 国产精品福利区一区二区三区四区 | 亚洲色大成网站www永久一区| 天美传媒一区二区三区| 亚洲A∨无码一区二区三区| 日韩精品人妻av一区二区三区| 天堂va在线高清一区| 无码人妻一区二区三区在线| 一区二区三区在线播放视频| 亚洲熟女www一区二区三区| 亚洲图片一区二区| 少妇激情AV一区二区三区| 国产免费一区二区三区不卡| 一区二区三区在线播放视频| 秋霞鲁丝片一区二区三区| 亚洲高清一区二区三区| 人妖在线精品一区二区三区| 久久无码人妻一区二区三区| 亚洲AV美女一区二区三区| 国产成人精品视频一区二区不卡| 一区二区三区无码视频免费福利| asmr国产一区在线| 国产在线观看一区精品 | 无码日韩精品一区二区人妻| 国模极品一区二区三区| 国产成人一区二区三区高清| 天堂成人一区二区三区| 四虎精品亚洲一区二区三区| 无码日韩人妻AV一区免费l| 一区二区三区免费在线观看| 91久久精一区二区三区大全| 国产av熟女一区二区三区| 无码人妻精品一区二区三| 久久久久成人精品一区二区| 精品午夜福利无人区乱码一区|