学习笔记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");

    }

  }

}

原文地址:https://www.cnblogs.com/pylblog/p/7396867.html