上一篇文章我们主要讲解了一些webApi和redis缓存操作,这篇文章我们主要说一些MVC相关的知识(过滤器和错误处理),及采用ajax调用webApi服务。

本篇例子采用的开发环境为:VS2010(sp1)、MVC4,所有的数据都是与webApi服务进行交互。

1、先来一张项目结构图

  1. LoginAttribute.cs为我们定义的Action过滤器,主要检测是否登陆。因为我们要测试sessioin共享,就做了一个登陆界面,存储用户名。
  2. BaseController.cs 公共控制器,主要重写OnException方法对错误捕捉。HomeController继承BaseController。
  3. ErrorController.cs 错误控制器
  4. LoginController.cs登陆控制器。

1.1、LoginAttribute.cs 过滤器

LoginAttribute继承ActionFilterAttribute并重写了OnActionExecuting方法,OnActionExecuting方法会先与控制器Action执行,因此我们可以在该方法中判断session是否为空。我们打开ActionFilterAttribute发现里面有四个方法OnActionExecuted、OnActionExecuting、OnResultExecuted、OnResultExecuting,不清楚其执行顺序的童鞋可以百度一下,这里就不用介绍了,下面直接看代码。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using Common;
  7.  
  8. namespace MvcApplication2.Attribute
  9. {
  10. public class LoginAttribute : ActionFilterAttribute
  11. {
  12. public override void OnActionExecuting(ActionExecutingContext filterContext)
  13. {
  14. SessionHelper session = new SessionHelper();
  15. if (session["user"] == null)
  16. {
  17. filterContext.Result = new RedirectResult("~/Login/index");
  18. }
  19. base.OnActionExecuting(filterContext);
  20. }
  21. }
  22. }

1.2、BaseController.cs 控制器基类

BaseController继承MVC的Controller,在BaseController.cs中我们重写OnException方法进行异常处理,我们可以记录日志,跳转错误页面等,这也我们就不用每个页面写自己的异常处理了,在BaseController中我们定义了一个SessionHelper session的变量,SessionHelper为上一篇文章介绍的基于Redis的session共享,这样只要继承BaseController的页面都可以只用该变量。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using Common;
  7.  
  8. namespace MvcApplication2.Controllers
  9. {
  10. public class BaseController : Controller
  11. {
  12. protected SessionHelper session = new SessionHelper();
  13.  
  14. public BaseController()
  15. {
  16.  
  17. }
  18. /// <summary>
  19. /// 异常处理
  20. /// </summary>
  21. /// <param name="filterContext"></param>
  22. protected override void OnException(ExceptionContext filterContext)
  23. {
  24. if (filterContext.HttpContext.Request.IsAjaxRequest())
  25. {
  26. JsonResult result = new JsonResult();
  27. result.Data = new { type = "error", data = "请求异常" };
  28. filterContext.Result = result;
  29. }
  30. else
  31. {
  32. filterContext.Result = new RedirectResult("~/error/index");
  33. }
  34. filterContext.ExceptionHandled = true;
  35. base.OnException(filterContext);
  36. }
  37. }
  38. }

1.3、LoginController.cs 为登陆控制器

该页面值需要填写用户名,然后把该用户名存到session中,这样webAPi项目中的Get方法也会获取到该session值(详细看上一篇博文)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using Common;
  7.  
  8. namespace MvcApplication2.Controllers
  9. {
  10. public class LoginController : Controller
  11. {
  12. //
  13. // GET: /Login/
  14.  
  15. public ActionResult Index()
  16. {
  17. return View();
  18. }
  19. [HttpPost]
  20. public ActionResult LoginIn(string user)
  21. {
  22. SessionHelper session = new SessionHelper();
  23. user = Request.Form["user"];
  24. if (!string.IsNullOrWhiteSpace(user))
  25. {
  26. session["user"]=user.ToString();
  27. return RedirectToAction("index", "Home");
  28. }
  29.  
  30. return RedirectToAction("LoginIn", "Login");
  31. }
  32.  
  33. }
  34. }

1.4、HomeController.cs 展示数据控制器

HomeController继承BaseController,并且在用[Login]过滤器作用在HomeController上,这样每一个Action前都会执行LoginAttribute,判断session值是否为空,

HomeController也继承了BaseController中的错误处理,具体看代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using Common;
  7. using MvcApplication2.Attribute;
  8.  
  9. namespace MvcApplication2.Controllers
  10. {
  11. [Login]
  12. public class HomeController : BaseController
  13. {
  14. //
  15. // GET: /Home/
  16.  
  17. public ActionResult Index()
  18. {
  19. ViewBag.User = session["user"].ToString();
  20. return View();
  21. }
  22. public ViewResult Add()
  23. {
  24. return View();
  25. }
  26. public ViewResult edit(string id)
  27. {
  28. ViewBag.id = id;
  29. return View();
  30. }
  31. public ActionResult LogOut()
  32. {
  33. session["user"] = null;
  34. return RedirectToAction("index", "Login");
  35. }
  36.  
  37. }
  38. }

视图页面就不介绍了,感兴趣的童鞋可以下载源代码查看。

1.5、ErrorController.cs 错误页面,这里就不介绍了

2、测试

2.1、MVC项目和WebApi部署

  1. webApi为上一篇介绍的webApi程序。
  2. webApiTest为本片介绍的MVC项目。
  3. 域名都是localhost,不牵扯跨域问题

2.2、上几张图片

1、登陆界面

2、点击登陆,进入首页面,记得打开Redis缓存服务

我们发现我们获取登陆页面的session值,并取到webApi服务中的数据,说明webApi项目的session也有值了,因为webApi项目的HttpResponseMessage Get()方法也做session值是否为空的判断,详见上一篇博客的说明。

好了项目就写到这里吧,我只实现了数据的获取和数据修改功能,增加和删除没有实现。如果你感兴趣欢迎交流学习。

点击下载源代码

每天学习一点点,每天进步一点点。

MVC4+WebApi+Redis Session共享练习(下)的更多相关文章

  1. MVC4+WebApi+Redis Session共享练习(上)

    这几天生病了,也没有心情写博客,北京医院真心伤不起呀,钱不少花,病没治好,还增加了新病,哎不说了,周末还得去大医院检查一下,趁女盆友还没有回来,把前几天写的东西总结一下.本文也会接触一点webApi的 ...

  2. nginx tomcat负载均衡 使用redis session共享

    环境准备 1.准备一台nginx服务器 ip192.168.1.133 端口81 安装过程: #首先安装依赖: yum -y install gcc-c++ yum -y install pcre p ...

  3. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  4. Tomcat 集群 + Redis Session 共享出现 Session 瞬间失效问题

    写在前面的话 写这篇博客出于公司最近要迁移到新的云上面且对之前的资源,架构做一个升级. 本来是一个不大的项目,旧环境旧一个 TOMCAT 跑起来,不过出于高可用考虑,新环境决定使用 TOMCAT 集群 ...

  5. tomcat redis session共享

    编译redis所需要的序列化包 安装 gradle Linux & MacOS users Configure your PATH environment variable to includ ...

  6. redis session 共享 测试案列

    下载 spring redis session demo 2.分别在不同的服务器上启动 3.nginx 安装 测试

  7. springboot-不同名称项目的 redis session共享

    引入JAR <dependency> <groupId>org.springframework.session</groupId> <artifactId&g ...

  8. redis session共享中的序列化问题

    今天在做session对象存入redis(set方法)时,碰到一个空指针异常,代码如下: public class CheckAccount extends HttpServlet { public ...

  9. Tomcat7 Redis Session共享

    1.环境 服务器 centos7 tomcat 7 redis nginx 2.配置tomcat配置文件context.xml <Valve className="com.orange ...

随机推荐

  1. java 字节数组转int

    4字节数组转int类型 小端模式 /** * 数组转int类型 * * @param src * @return */ public static int bytesToInt(byte[] src) ...

  2. 多线程之 Final变量 详解

    原文: http://www.tuicool.com/articles/2Yjmqy 并发编程网:http://ifeve.com/java-memory-model/ 总结: Final 变量在并发 ...

  3. mybatis like的用法

    oracle数据库: SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或 SELECT * FROM user WHERE nam ...

  4. linux C学习笔记05--信号量与共享内存(进程同步)

    花了半天时间把信号量与共享内存整合到了一起,先来看信号量代码,semaphore.c 当中sem_P()和sem_V()函数分别为信号量等待和信号量释放. 两个进程同时访问共享内存,为了避免发生同时读 ...

  5. sql子查询 嵌套SELECT语句

    嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在sele ...

  6. 使用阿里Docker镜像加速器加速

    在阿里开发者平台注册开发者账号 https://dev.aliyun.com/search.html 注册之后可以访问Docker镜像服务 https://cr.console.aliyun.com/ ...

  7. linux配置的问题

    1 从系统设置-文本设置中把双拼删掉 2 通过sudo passwd root 修改root密码 3 通过su获取root权限 4 通过sudo pppoeconf输入宽带帐号密码 5 把更新源修改成 ...

  8. GridView多列排序

    public class WebGridView:GridView { 属性#region 属性 /**//// <summary> /// 是否启用或者禁止多列排序 /// </s ...

  9. Unicode explorer

    It can be cumbersome to work out some of the details of this by hand, so you can use the little Java ...

  10. vim基础使用

    vim的常用模式有分为命令模式,插入模式,可视模式,正常模式.本教程中,只需要用到正常模式和插入模式.二者间的切换即可以帮助你完成本指南的学习. 进入方法: vim xxx.xml 正常模式 正常模式 ...