原理,利用session的机制,只有正常登录才会去到后台,如果是非法登录,则返回到初始界面
1、在App_Start文件里面新建一个LoginInterceptor类
这是里面的代码,效果就是当进入登陆界面就不拦截,如果是其他界面就要判断是否存在session
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
public class LoginInterceptor : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// 获取当前请求的控制器和操作方法
string controllerName = filterContext.RouteData.Values["controller"].ToString();
string actionName = filterContext.RouteData.Values["action"].ToString();
// 如果当前请求的是登录操作,则不进行重定向
if (controllerName == "Home" && actionName == "Login")
{
base.OnActionExecuting(filterContext);
return;
}
// 检查用户是否已登录
if (filterContext.HttpContext.Session["user"] == null)
{
/*
返回到了登陆界面,并且弹出提示信息
*/
filterContext.HttpContext.Response.Write("<script>alert('请先登录!');window.location.href='/Home/Login';</script>");
filterContext.Result = new EmptyResult();
return;
}
base.OnActionExecuting(filterContext);
}
}
2、在对应的控制层标记session
这里是你要使用的控制器标注拦截器即可,标注后说明这个控制器里面都受到该拦截器限制
[AllowAnymous]:用于标记不受拦截器作用的方法
[HttpPost]
[AllowAnonymous]
public ActionResult Login(string username,string password)
{
//如果账号或者密码有空,直接返回失败
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
{
return ErrorResult("缺少必要参数,请求失败");
}
else
{
//调用用户登录的方法
var data = logicUser.CheckLogin(username, password);
if (data != null)
{
Session["user"] = true;
return SuccessResult("登录成功");
}
else
{
return ErrorResult("登录失败");
}
}
}
总结思路:创建一个拦截器类继承 ActionFilterAttribute,在里面重写了 OnActionExecuting这个方法,表明什么需要拦截,什么不用拦截即可。思路跟java里面的spring MVC思路差不多,只不过springmvc是实现HandlerInterceptor接口,里面也是重写preHandle方法,不定期更新c#的asp.net,目前已转行c#,已上班。