学习笔记44_登录控制器
1.验证码控制器
前台<img id="img_Vcode" src="/Controller/action?s=1">//参数是为了改变src用,而不是为了向后台传
<a id="huan"> 开不清,换一张</a> //利用图片src改变浏览器自动重新获取图片
<script>
$("#huan").click(fuction(){
var oldsrc = $("img_Vcode").atrr("src");
var t = (new Data()).getSections();
$("img_Vcode").atrr("src", oldsrc+t);
});
function afterLogin(result)
{
if(data=="ok")
{
window.top.location.href="/controller/action"
}
else
{
alert("登录失败");//或者设置某个label显示
//并且同时刷新验证码
}
}
</script>
//使用微软自带的异步表单提交
@Ajax.BeginForm(“controller”,"action",new AjaxOptions(){OnSuccess="afterLogin(JavaScript方法)"})
{
//Html表单元素
}
控制器 .验证码方法:
*先准备一个方法,能输入一串字符,输出byte[],byte是图片经过MenonyStream转换的字节数组、
pubic ActionResult ShowCodePicture()
{
var tt = new XXX();//生成验证码对象类
string strCode = "xxxx";//一般由上面的类提供
Session["VCode"] = strCode;
byte[] imgBytes = tt.GetPictrueBytes(strCode);
return File(imgBytes, "image/jpeg");
}
public AciontResult ProcessLogin()//此处可以定义一个ViewMode来接收,单是ViewMode的属性名,应该和html控件的name一致
{
//处理验证码
string strCode= Request["控件name"];
string sessionCode = Session["VCode"] as string;
Session["VCode"] = null;//**验证码取一次就应该让其为null
if(string.IsNullOrEmpty|| sessionCode!=null )
{
return Content("验证码错误");//返回这串,给前台在html标签中显示
}
//处理用户名密码
string uid = Request["LoginCode"];
string pwd = Request["LoginPwd"];
//var userinfo = Service.GetEntities(u=>u.uid==uid&&u.pwd==pwd).FirstOrDefault();
**不用EF也行,反正要获取到实例
//if(userinfo==null)
//{
//return Content("密码错误");//返回这串,给前台在html标签中显示
//}
session["LoginUser"] = userinfo;//是使用session来记录会话状态
Respone.Cookies["LoginCode"].value = uid;//往客户端写入cookie,以便下次请求页面时填写默认的用户名。
//如果正确那么跳转到首页
return Content("ok");//后台不要直接使得页面重定向,为了接口通用性,以及前台逻辑问题
//上边是返回 Content(""),这里应该也是返回Content("")
}
//登录验证
所有控制器的Action都必须
if(Session["LoginUser"]==null)
{
if(Session["loginUser"]==null)
{
return RedirectToAction("Index","UserLogin");
}
}
为了避免这样的情况,需要使用到过滤器
public class LoginCheckFilterAttribute:ActionFilterAttribute
{
bool needCheck=true;
public bool NeedCheck {... }//这个是为了登录页面不用校验,否则就死循环了
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if(NeedCheck==false) return;
//检验用户是否登录
if( filterContext.HttpContext.Session["LoginUser"]==null)
{
filterContext.HttpContext.Respone.Redirect("/UserLogin/Login");
}
}
}
//在App_Start的FilterConfig.cs中,可以注册全局过滤器
public class FilterConfig
{
public static void RegisterGlobalFilters(ClobalFilterCollection filters)
{
filters.Add(new LoginCheckFilterAttribute);//那么,这样会造成所有的页面都校验
}
}
//同时设置登录的控制器不用校验
[LoginCheckFilter(NeedCheck=false)]//全局打了标签,这里也打了标签,那么只是这里起作用
public class LoginController:Controller
**********************************分割线*************************************
登录验证的第二种方式,像WebFrom一样,写一个基Controller来验证登录,让其他Controller来继承
由于Controller本身就实现了IActionFillter,本身就带有过滤功能,所以,可以override它的实现方法达到目的。
public class BaseController:Controller//本来
{
protected bool needCheck=true;
protected UserInfo currentUser{get;set;}
protect override void OnActionExecuting(ActionExecutingContext filterContext)
{
//在当前的控制器里面所有的方法执行之前,都先执行此代码
base.OnActionExecuting(filterContext);
//跟上面的LoginCheckFilterAttribute的代码
if(needCheck==false) return;
//检验用户是否登录
currentUser = filterContext.HttpContext.Session["LoginUser"] as UserInfo;
if( currentUser ==null)
{
filterContext.HttpContext.Respone.Redirect("/UserLogin/Login");
}
}
}