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

        }

      }

    }

  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/pylblog/p/7396867.html
Copyright © 2020-2023  润新知