Blazor實現未登錄重定向到登錄頁的方法


今天研究了一下blazor,發現他默認啟動就是類似於后台管理系統的界面,看到這個頁面我就想給他寫個登錄,有登錄就涉及到未登錄重定向的問題,但是我沒有找到blazor全局路由的設置,知道的老哥可以告訴我一下哈,在這里我是基於操作LocalStorage的方法,如果訪問默認布局時若沒有LocalStorage,就重定向到login頁,其實也可以判斷不存在LocalStorage就將布局渲染為登錄頁,也不知道那種正規,我采用的是重定向的方法

首先新建一個類叫LocalStorageHelper.cs 用來調用js操作LocalStorage

using Microsoft.JSInterop;
using System.Threading.Tasks;

namespace BlazorLoginTest
{
	/// <summary>
	/// 操作LocalStorage幫助類
	/// </summary>
	public class LocalStorageHelper
    {
        private readonly IJSRuntime _jsRuntime;
        public LocalStorageHelper(IJSRuntime jsRuntime)
        {
            _jsRuntime = jsRuntime;
        }
        /// <summary>
        /// 設置LocalStorage
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public async Task SetLocalStorage(string key, string value)
        {
            await _jsRuntime.InvokeVoidAsync("LocalStorageSet", key, value);
        }
        /// <summary>
        /// 獲取LocalStorage
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public async Task<string> GetLocalStorage(string key)
        {
            return await _jsRuntime.InvokeAsync<string>("LocalStorageGet", key);
        }
    }
}

然后在wwwroot文件夾下面新建js文件夾 新建文件LocalStorageHelper.js

function LocalStorageSet(key, value) {
    localStorage.setItem(key, value);
};
function LocalStorageGet(key) {
    return localStorage.getItem(key);
};

index.html里面引用一下這個js

<script src="js/LocalStorageHelper.js"></script>

到Pages文件夾里面新建一個razor組件 Login.razor

@page "/login"
@layout LoginLayout
@inject IJSRuntime JSRuntime
@inject NavigationManager navigationManager

<form class="form-horizontal">
    <div class="form-group">
        <label for="inputEmail3" class="col-sm-2 control-label">請輸入郵箱地址</label>
        <div class="col-sm-10">
            <input type="email" class="form-control" id="inputEmail3" placeholder="Email" @bind-value="@Email">
        </div>
    </div>
    <div class="form-group">
        <label for="inputPassword3" class="col-sm-2 control-label">請輸入密碼</label>
        <div class="col-sm-10">
            <input type="password" class="form-control" id="inputPassword3" placeholder="Password" @bind-value="@Password">
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <button type="button" class="btn btn-primary" @onclick="LoginMethod">Sign in</button>
        </div>
    </div>
</form>
@code{
    private string Email { get; set; }
    private string Password { get; set; }
    private async Task LoginMethod()
    {
        if (Email == "admin@abc.com" && Password == "123456")
        {
            Console.WriteLine("登錄成功");
            LocalStorageHelper localStorageHelper = new LocalStorageHelper(JSRuntime);
            await localStorageHelper.SetLocalStorage("email", Email);
            navigationManager.NavigateTo("/", false);

        }
    }

}

因為登錄頁面如果使用默認布局就會也顯示左側導航,所以需要給他指定一個布局 在shared文件夾下面新建文件LoginLayout.razor

@inherits LayoutComponentBase
<div class="main">
    <div class="top-row px-4">
        <a href="http://blazor.net" target="_blank" class="ml-md-auto">About</a>
    </div>

    <div class="content px-4">
        @Body
    </div>
</div>

啟動項目 手動輸入網址https://localhost:44344/login

https://images.cnblogs.com/cnblogs_com/Hero-/1853471/o_200924092421%E7%99%BB%E5%BD%95%E7%95%8C%E9%9D%A2.png

用戶名 admin@abc.com
密碼 123456

登錄成功可以進入首頁 發現LocalStorage已經成功寫入數據了

最后去默認布局文件MainLayout.razor里面,重新組件初始化方法,判斷LocalStorage里面是否存在email,不存在則重定向到登錄頁

@inherits LayoutComponentBase
@inject IJSRuntime JSRuntime
@inject NavigationManager navigationManager
<div class="sidebar">
    <NavMenu />
</div>

<div class="main">
    <div class="top-row px-4">
        <a href="http://blazor.net" target="_blank" class="ml-md-auto">About</a>
    </div>

    <div class="content px-4">
        @Body
    </div>
</div>
@code{
    protected override async Task OnInitializedAsync()
    {
        LocalStorageHelper localStorageHelper = new LocalStorageHelper(JSRuntime);
        if (string.IsNullOrEmpty(await localStorageHelper.GetLocalStorage("email")))
        {
            navigationManager.NavigateTo("Login");
        }
    }
}

可以清空LocalStorage刷新試一下,發現已經重定向到登錄頁了

如果只想設置某些組件需要登錄,可以再寫一個組件用來判斷,然后在需要登錄的組件里引用那個組件就好了

只不過麻煩了一點,但是在默認布局里面寫判斷的話,如果用戶不刷新就不會執行初始化里面的代碼了

源碼地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM