继续上一篇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 == ) {
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 == ) {
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 ? : ;
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 * * * ));
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 = ; i < ca.length; i++) {
var c = cap[i];
while (c.charAt() == ' ') {
c = c.substring(, c.length);
}
if (c.indexOf(nameEQ) == ) {
var found = c.substring(nameEQ.length, c.length);
cookieValue = found;
}
}
return cookieValue;
}
function eraseCookie(name) {
createCookie(name,"",-);
}

运行如下

谢谢观赏

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

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

    同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹 添加Nuget包 在Models文件夹里面添加UserModel类 public string Use ...

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

    这是NancyFx开源框架中的Basic认证,学习一下! 首先当然是新建一个空的Web,BasicDemo 继续在项目中添加Nuget包,记得安装的Nuget包是最新的预发行版 Nancy Nancy ...

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

    NancyFx框架的自定义模块 新建一个空的Web项目 然后通过NuGet库安装下面的包 Nancy Nancy.Hosting.Aspnet 然后添加Models,Module,Views三个文件夹 ...

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

    NancyFx框架中使用绑定模型 新建一个空的Web程序 然后安装Nuget库里面的包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Spark 并在We ...

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

    Nancy框架的Owin使用 先建一个空的Web项目 然后往Nuget库里面添加Nancy包 Nancy Nancy.Owin Nancy.ViewEnglines.Spark 然后添加Models, ...

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

    新建一个空的项目 新建好了空的项目以后,接着通过NuGet安装一下三个包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Razor 然后在项目中添加Mod ...

  7. NancyFx 2.0的开源框架的使用-Forms

    同样的像前面2篇博文一样,每个项目的开始基本都是建个空的Web项目 在NuGet库中安装以下几个NuGet包 Nancy Nancy.Authentication.Forms Nancy.Hostin ...

  8. NancyFx 2.0的开源框架的使用-AspnetBootstrapping

    新建一个空的Web项目AspnetBootstrappingDemo 然后添加NuGet组件 Nancy Nancy.Hosting.Aspnet Nancy.ViewEngines.Razor 继续 ...

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

    新建一个空的Web项目,命名CachingDemo 然后添加三个Nuget安装包 Nancy Nancy.Hosting.Aspnet Nancy.ViewsEngines.Razor 然后往项目里面 ...

随机推荐

  1. HTTP认证

    参考博文:HTTP协议详解 HTTP请求报头: Authorization HTTP响应报头: WWW-Authenticate HTTP认证是基于质询/回应(challenge/response)的 ...

  2. 解决Highcharts 5.0.7,IE8下bar类型图表无法显示的问题

    引用如上, 当图标类型为bar时,IE8无法直接显示, 官网也一样, 但通过切换图例可以显示, 所以加入以下代码解决此问题 未经允许,严禁转载!!!

  3. 如何用 JavaScript 下载文件

    简介 我们知道,下载文件是一个非常常见的需求,但由于浏览器的安全策略的限制,我们通常只能通过一个额外的页面,访问某个文件的 url 来实现下载功能,但是这种用户体验非常不好. 幸好,HTML 5 里面 ...

  4. 谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  5. inux的进程-进程的概念和fork创建进程

    一.  什么是进程? 初学者,可能认为程序或者一段代码就是一个进程.其实这样说是很不全面的,进程简单的说就是一个个条件. 1.需要一个代码 2.需要运行这个代码环境和资源 从下面的一段代码,我们来分析 ...

  6. 【Flex】去除外边框,底背景透明,改变exe的icon

    一.去除程序外边框 1.在 xx-app.xml文件里,找到  <!-- <systemChrome></systemChrome> -->  这句话,然后删掉注释 ...

  7. sublime Text3快捷键使用大全

    Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本.Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函数名等.Ct ...

  8. js实现文本框溢出文字用省略号(...)表示

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. png、jpg、gif三种图片格式的区别

    png.jpg.gif三种图片格式的区别   2014-06-17 为什么想整理这方面的类容,我觉得就像油画家要了解他的颜料和画布.雕塑家要了解他的石材一样,作为网页设计师也应该对图片格式的特性有一定 ...

  10. Mac OS平台下应用程序安装包制作工具Packages的使用介绍(补充)

    上一篇:Mac OS平台下应用程序安装包制作工具Packages的使用介绍 补充说明 上一篇文章中介绍了如何使用Packages如何创建mac下的安装包.但是这样制作出来的安装包只能安装到系统的文件路 ...