继续上一篇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. httpclient源码分析之MainClientExec

    MainClientExec是HTTP请求处理链中最后一个请求执行环节,负责与另一终端的请求/响应交互,也是很重要的类. 源码版本是4.5.2,主要看execute方法,并在里面添加注释.接着详细说下 ...

  2. Solr6.5在Centos6上的安装与配置 (一)

    这篇文章主要是介绍在Centos6上Solr6.5的安装与配置. 一.安装准备及各软件使用版本说明: 1.JDK8,版本jdk1.8.0_121下载地址:jdk-8u121-linux-x64.tar ...

  3. Tcl与Design Compiler (十三)——Design Compliler中常用到的命令(示例)总结

    本文如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 本文将描述在Design Compliler中常用 ...

  4. [原]C#与非托管——初体验

    P/Invokes初看起来非常简单,利用DllImport进行extern函数的声明,程序就可以在调用extern函数的时候自动查询调用到对应的非托管函数,有些类似Java的native函数,但更为简 ...

  5. Linux的链接文件-ln命令

    Linux的链接文件 使用ln命令来创建链接文件(link) Linux链接分两种:硬链接(Hard Link),符号链接(Symbolic Link) 默认情况下,ln命令产生硬链接. [root@ ...

  6. Intellij IDEA 没办法创建java文件

    然后就是具体的解释和解决方案. 如上图红圈所示,我们可以根据对项目的任意目录进行这五种目录类型标注,这个知识点非常非常重要,必须会. Sources 一般用于标注类似 src 这种可编译目录.有时候我 ...

  7. linux环境下 mysql数据库忘记密码 处理办法UPDATE user SET Password = password ( 'new-password' ) WHERE User = 'root' ;

    整个修改过程大概3-10分钟(看个人操作),这个时间内mysql出于不需要密码就能登陆的状态,请设法保证系统安全 不罗嗦直接上步骤 1.vi /etc/my.cnf 在[mysqld]下,添加一句:s ...

  8. dubbo个人总结

    dubbo,分布式服务框架,RPC服务框架. 注册中心zk,redis......,使用大多为zk 注册流程 最后一图 服务提供者启动时向/dubbo/com.foo.BarService/provi ...

  9. 【Linux配置】vim配置文件内容

    vim的配置 文件:~/.vimrc 在自己的家目录中的.vimrc文件进行编辑配置 设置如下: set nu "序号 set tabstop= "tab键的大小 set show ...

  10. elasticsearch系列(一) 术语

    elasticsearch(以下简称es)是一款开源的搜索引擎,基于apach lucene.最近在做nlp的时候顺便研究一下. 下面是官方列举的术语解释 Near Realtime 接近实时的查询, ...