zoukankan      html  css  js  c++  java
  • 学习笔记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");

        }

      }

    }

  • 相关阅读:
    SharePoint的安装配置
    onkeypress与onkeydown及 oncopy和onpaste 事件区别详细说明
    sql Server 的基本函数
    iOS 错误 之 http请求
    iOS 错误及解决汇总
    iOS 开源库 之 AFNetWorking 2.x
    linux 下 tomcat 之 配置静态资源路径
    iOS 之 Block Variable
    iOS 协议
    #import与@class的区别
  • 原文地址:https://www.cnblogs.com/pylblog/p/7396867.html
Copyright © 2011-2022 走看看