NancyFx 2.0的开源框架的使用-Stateless(二)

继续上一篇Stateless的博文,在上一篇的博文的基础上稍微加点东西

接下来右键解决方案添加新项目,一样建一个空的Web项目

然后在StatelessDemoWeb项目里面添加Views文件夹,Scripts文件夹,并在Views文件夹里面添加index,login,secure三个页面

在index页面添加如下代码

<body>
    <div id="loggedIn" style="display:none;"><p>欢迎<span id="username">.</span><a href="#" id="logout">登出</a></p></div>
    <h1>非安全页面</h1>
    <p><a href="secure.html">安全页面</a></p>
    <script type="text/javascript">
        $(document).ready(function () {
            var apiToken = ApiToken.Get();
            if (apiToken.IsValid) {
                $("#loggedIn").show();
                $("#username").html(apiToken.Username);
                $("#logout").click(function () {
                    var request = { apiKey: apiToken.Key };
                    var success = function () {
                        ApiToken.Delete();
                        window.location = "index.html";
                    };
                    $.ajax({
                        type: ‘DELETE‘,
                        url: api.auth,
                        data: request,
                        success: sucess,
                        dataType: "json"
                    });
                });
            }
        });
    </script>
</body>

在login页面添加如下代码

<body>
    <div>
        <input type="text" id="Username" placeholder="登陆名"/><br />
        <input type="password" id="Password" placeholder="密码"/><br />
        <input id="RememberMe" type="checkbox" value="True"/><br />
        <button id="submitButton">登陆</button>
    </div>
    <div id="errorBox" style="display:none">
        无效的用户名和密码
        <script type="text/javascript">
            $(document).ready(function () {
                $("#submitButton").click(function () {
                    $("#errorBox").hide();
                    var authRequest = {
                        username: $("#Username").val(),
                        password: $("#Password").val(),
                        rememberMe: $("RememberMe").val()
                    };
                    var success = function (response) {
                        ApiToken.Set(authRequest.username, response.ApiKey, authRequest.rememberMe);
                        window.location = "index.html";
                    };
                    var error = function () {
                        $("#errorBox").show();
                    };
                    $.ajax({
                        type: ‘POST‘,
                        url: api.auth,
                        data: authRequest,
                        success: success,
                        error: error,
                        dataType: "json"
                    });
                });
            });
        </script>
    </div>
</body>

在secure页面添加如下代码

<body style="display:none">
    <div>
        <a href="index.html">&lt;&lt;主页</a>
        <div id="loggedIn" style="display:none">
            <p>欢迎<span id="username"></span>.<a href="#" id="logout">登出</a></p>
        </div>
        <h1>安全页面</h1>
        <div>安全内容:<span id="secureContent" class="secure"></span></div>
        <div>
            <input type="text" id="newusername" placeholder="用户名"/><br />
            <input id="newpassword" type="password" placeholder="密码"/><br />
            <input type="button" onclick="createUser()"/>
            <div id="createuserresult"></div>
        </div>
    </div>
    <script type="text/javascript">
        $(document).ready(function () {
            //如果 apiKey 存在, 则表示用户已登录
            //检查 apiKey 是否存在
            var apiToken = ApiToken.Get();
            if (apiToken.IsValid) {
                //用户已登录
                //获取和显示安全内容
                //使用我们存储在 cookie 中的 apiKey
                var request = { apiKey: apiToken.Key };
                //成功视图
                var success = function (response) {
                    $("#username").html(apiToken.Username);
                    $("#secureContent").html(response.SecureContent);
                    $("body").show();
                };
                //将用户重定向到401上的登录页
                var error = function (response) {
                    if (response.status == 401) {
                        window.location = "login.html";
                        return;
                    }
                    alert("出问题了" + response.error);
                };
                $.ajax({
                    url: api.secure,
                    data: request,
                    success: success,
                    error: error,
                    dataType:"json"
                });
            }
            else {
                //如果没有保存 apiToken, 则表示用户尚未登录
                //将 "em 打包" 发送到登录页
                window.location = "login.html";
            }
            if (apiToken.IsValid) {
                $("#loggedIn").show();
                $("#username").html(apiToken.Username);
                $("#logout").click(function () {
                    //将 apiKey 发送到要销毁的 api
                    var request = { apiKey: apiToken.Key };
                    //当契约在服务器上完成时,
                    //删除客户端中的 cookie, 然后重定向到主页。
                    var success = function () {
                        apiToken.Delete();
                        window.location = "index.html";
                    };
                    $.ajax({
                        type: ‘DELETE‘,
                        url: api.auth,
                        data: resquest,
                        dataType: "json"
                    });
                });
            }
        });
        function createUser() {
            var apiToken = ApiToken.Get();
            if (apiToken.IsValid) {
                //用户已登录
                var request = {
                    username: $("#newusername").val(),
                    password: $("#newpassword").val()
                };
                //成功视图
                var success = function (response) {
                    $("#createuserresult").html("用户" + response.username + "已创建");
                };
                //将用户重定向到401上的登录页
                var error = function (response) {
                    if (response.status == 401) {
                        window.location = "login.html";
                        return;
                    }
                    alert("出问题了" + response.error);
                };
                $.ajax({
                    type: "POST",
                    url: api.create_user + "?ApiKey=" + apiToken.Key,
                    data: request,
                    success: success,
                    error: error,
                    dataType:"json"
                });
            }
            else {
                //如果没有保存 apiToken, 则表示用户尚未登录
                //将 "em 打包" 发送到登录页
                window.location = "login.html";
            }
        }
    </script>
</body>

然后在script文件夹添加api.js,apiToken.js两个文件,然后修改api.js文件如下

var api = {
    auth: "http://localhost:9611/restApi/auth",
    secure: "http://localhost:9611/restApi/secure",
    create_user:"http://localhost:9611/resApi/secure/create_user"
};

apiToken.js文件添加如下代码

var apiKeyKey = "sample_apiKey";
var usernameKey = "sample_username";

var ApiToken = {
    Set: function (username, apiKey, rememberMe) {
        var days = rememberMe ? 10 : 0;
        createCookie(apiKeyKey, apiKey, days);
        createCookie(usernameKey,username,days);
    },
    Get: function ()
    {
        var key = readCookie(apiKeyKey);
        var username = readCookie(usernameKey);
        var token = { Key: key, Username: username, IsValid: key != null };
        return token;
    },
    Delete: function ()
    {
        eraseCookie(apiKeyKey);
        eraseCookie(usernameKey);
    }
};
function createCookie(name,value,days)
{
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 1000));
        var expires = ";expires=" + date.toGMTString();
    } else {
        var expires = "";
        document.cookie = name + "=" + value + expires + ";path=/";
        console.log(document.cookie);
    }
}
function readCookie(name) {
    var cookieValue = null;
    var nameEQ = name + "=";
    var ca = document.cookie.split(‘;‘);
    for (var i = 0; i < ca.length; i++) {
        var c = cap[i];
        while (c.charAt(0) == ‘ ‘) {
            c = c.substring(1, c.length);
        }
        if (c.indexOf(nameEQ) == 0) {
            var found = c.substring(nameEQ.length, c.length);
            cookieValue = found;
        }
    }
    return cookieValue;
}
function eraseCookie(name) {
    createCookie(name,"",-1);
}

谢谢观赏

时间: 2024-10-17 16:13:59

NancyFx 2.0的开源框架的使用-Stateless(二)的相关文章

NancyFx 2.0的开源框架的使用-Stateless

同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹 添加Nuget包 在Models文件夹里面添加UserModel类 public string Username { get; set; } public UserModel(string username) { Username = username; } 在Models文件夹里面添加Userdatabase类 static readonly List<Tuple<string, string&

NancyFx 2.0的开源框架的使用-Basic

这是NancyFx开源框架中的Basic认证,学习一下! 首先当然是新建一个空的Web,BasicDemo 继续在项目中添加Nuget包,记得安装的Nuget包是最新的预发行版 Nancy Nancy.Authentication.Basic Nancy.Hosting.Aspnet 之后就往项目中添加Models文件夹和Module文件夹,然后往Models文件夹里面添加UserValidator类 public ClaimsPrincipal Validate(string username

NancyFx 2.0的开源框架的使用-ModelBinding(实现绑定)

NancyFx框架中使用绑定模型 新建一个空的Web程序 然后安装Nuget库里面的包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Spark 并在Web应用程序里面添加Models,Module,Views三个文件夹 继续往Models文件夹里面添加Database,ModelBinders 然后往Models文件夹里面添加Customer类 public int Id { get; set; } public string Name { get

NancyFx 2.0的开源框架的使用-HosingOwin

Nancy框架的Owin使用 先建一个空的Web项目 然后往Nuget库里面添加Nancy包 Nancy Nancy.Owin Nancy.ViewEnglines.Spark 然后添加Models,Module,Views三个文件夹 往Models文件夹里面添加Index类 public string StatusMessage { get; set; } 然后往Module文件夹里面添加MainModule类 public MainModule() { Get("",Lexan=&

NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)

NancyFx框架的自定义模块 新建一个空的Web项目 然后通过NuGet库安装下面的包 Nancy Nancy.Hosting.Aspnet 然后添加Models,Module,Views三个文件夹,并在Models文件里面添加NancyRouteAttribute类 //路由的方法 public string Method { get; set; } //路由的路径 public string Path { get; set; } public NancyRouteAttribute(str

NancyFx 2.0的开源框架的使用-Authentication

新建一个空的项目 新建好了空的项目以后,接着通过NuGet安装一下三个包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Razor 然后在项目中添加Models,Module,Views三个文件夹,并在Models中添加UserModel类 public string Username { get; set; } public UserModel(string username) { this.Username = username; } 然后往Mo

NancyFx 2.0的开源框架的使用-Caching

新建一个空的Web项目,命名CachingDemo 然后添加三个Nuget安装包 Nancy Nancy.Hosting.Aspnet Nancy.ViewsEngines.Razor 然后往项目里面添加Models,Module,Views三个文件夹 再往Models文件夹里面添加CachingExtensions文件夹 然后往CachingExtensions文件夹里面添加ContextExtensions类 public static class ContextExtensions { p

SunSonic 3.0 ORM开源框架的学习

SubSonic 3.0简介 接触到SubSonic3.0 ORM框架是看了AllEmpty大神的从零开始编写自己的C#框架(链接在此)系列的随笔接触到的,本文章学习内容源于AllEmpty大神. SubSonic就是一个ORM开源框架.作者是Robe Conery,用C#语言写的.其中包含了T4模板可以快速生成数据层实体类,这是一个实用的快速开发框架.让开发人员原理SQL语句的拼接,专注于业务逻辑的实现.SubSonic 3.0支持MsSql.MySql与SQLite三种数据库,对数据库操作灵

【公开课:Java开源框架服务及CEP深入剖析】直播QQ群:228977971

一.课程简介 Java开源框架的服务体系是如何运行的? 什么是CEPCore?Java开源框架的服务有哪些关键要点? 如何根据用户的服务自动生成相关服务包装类? 来吧!一线开源框架资深设计师与你分享Java实战心得,手把手教你Java开源框架设计技巧! 二.主题 <Tiny服务及CEP深入剖析> 三.时间 2015-8-13(周四晚 20:00整) 四.课程地址 http://bbs.tinygroup.org/thread-1191-1-1.html 五.适合人群 A.对Tiny框架有兴趣的