web.config配置文件
此文件是整个系统的配置中心,它告诉iis服务器本网站需要哪些运行时环境,需要哪些环境,将要进行哪些操作,开发人员也会将一个常量性的数据放在此配置中,以备系统全局调用。此文件内容丰富,对于一些普适性的项目,不作说明,只针对本系统的配置作相应说明。
web.config配置文件
web.config是xml格式的文件,它是一种结构性文档,可以通过结点对数据进行遍历。第一行<?xml version="1.0" encoding="utf-8"?>说明了xml所使用的格式与本文件的编码类型,默认是unicode,这里改成了utf-8。下面就是configuration父级结点,也就是说,这里所有内容都是配置性的内容了。这里要重点说明的是connectionStrings结点,这一项保存了ABConnection数据库连接字符串。此字符串中包含了数据库文件,并声明了所需要的支持引擎(System.Data.SqlServerCe.4.0)。
在第97行有一个entityframework结点,这是vs自动配置的,用户可以在项目-属性中设置所使用的版本。当然,许多人还会在web.config中写membership,这是用来作权限控制的。这也是.NET MVC中的新功能,但是由于vs会因此自动建立数据表,导致用户对整个系统的掌握度降低,所以,权限方面设想了两种解决方案,后面会说。第70行runtime的第二子级都是默认引用的命名空间,当用户在本项目中新建一个类的时候,他们都会默认引用这些命名空间,以节省时间。
权限控制模块Filter
权限控制是一个网站系统的必须功能,大到角色权限,小到控制用户是否登陆,都有涉及。.net一直都为此提供了丰富的实用的方法,比如aspx时代的from验证,直接拖了控件就可以了,然后配置一下,每一页都会进行自动验证。而MVC不存在控制这个说法,所以拖控件这种形式已经不可取了,因为微软又给用户提供了membership来控制,但是由于membership要在数据库中自然生成表,而且,表的字段非常多,加上强制定义了一些person的属性,然后person实体类的构造方法又没有空参数的,所以,构造起来非常麻烦,想到每次要写几十个字段赋值,太可怕了。所以,经过考虑,决定自己来解决权限验证的问题,权限验证包括两部分:a.验证是不是在线用户;b.验证进行管理员操作的是不是管理员。其实这两种方法的实现是相同的,就拿检测用户是否存在为例说明,由于本项目目的在于应用.NET MVC,所以,期间并没有进行安全方面的过多设置。
由于所有的逻辑都要由控制器来控制,所以最先想到的就是从控制器获取控制权限,想在每一个控制中调用一个静态方法,那就可以先写一个父控制器,实现一个静态方法,然后其它的控制器都继承该控制器,之后在每一个控制器的方法中,先使用此静态方法验证一次。但是,此方法似乎打破了.NET MVC的正常文件结构。所以,最后没有采用它,而选择了.NET MVC中新的特性filter。filter其实就是方法的特性属性。如果控制了方法的属性,写了方法的事件,那么该方法执行以后就可以得到控制。
在项目中添加文件夹Filter,在此文件夹内新建类IsLogedAttribute.cs,这个类就是一个Filter,其功能是在执行一个控制器方法的时候,检测当前用户是否在线。
引用的命名空间:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.MVC;
using AlumniBook.Models;
using AlumniBook.Ensleep;
查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/
Ensleep是自己写的工具类,里面提供了一些封装的方法。Models是对实体模型的引用,保证了在此类中可以调用实体模型,进行数据比对。其它系统级的调用,都是.NET MVC项目中必需引用的命名空间。
public class IsLogedAttribute : FilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
{
}
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
此处省略代码内容
}
}
此类继承了FilterAttribute和IActionFilter两个类,后者是接口,前面一个父类提供了公用方法,后面接口则确保了要实现OnActionExecuted和OnActionExecuting方法。这两个方法就是Filter功能实现的重点。
OnActionExecuted是指在Action执行之后要执行的方法。这里面是要在方法执行之前进行操作,所以,这个方法无须进行额外操作。OnActionExecuting则是在方法执行之前触发,这里主要实现这个方法。它的参数为ActionExecutingContext类型,它包含了html请求中的所有属性,并且在方法执行完成后,它可以带着相应的数据回到之前的进程中,执行相应的操作。下面来看一下控制器方法如何引用Filter。
public class PersonalCenterController : Controller
{
[IsLoged]
public ActionResult Index()
{}
}
这是个人中心的控制器,Index是它的一个方法,当有请求Url为:/Personal/Index时,因为有IsLoged特性标记,所以,会先执行IsLoged中的OnActionExecuting方法。然后从filterContext中取得session,再查看服务器上的sesson是否保存着当前对话,若是没有,说明用户浏览器关掉过,或者是用户已经长久没有操作了,这个时候就要让用户退出,用户所请求的操作非法,将用户转向登陆页面。filterContext.HttpContext.Response.Redirect("/Log/Login", true);是控制用户请求的转向,true代表用户之前的请求操作是否继续执行,true是终止。也就是说,控制器中的Index方法还没有执行的时候,就已经结束了。如果session验证的数据存在,那么,会调用封装的方法Sleep.IsMyuser(),这个方法判定一个用户是否是合法用户,传入的是字符串用户名,因为是测试功能实现的,所以,此处没有进行md5加密。如果检测到是数据库中的用户,那么就不进行任何操作,这样,当Filter执行完成后,会自动跳回到之前的控制器中的方法继续执行。如果不是数据库中的用户,那么就是没有登陆,这个时候,将session中的username移除,然后将用户转向到登陆页面。