zoukankan      html  css  js  c++  java
  • 关于“验证码的制作”的一些补充

    上次写了点关于验证码制作的代码,算是学习了Drawing中的一些东西,心里很快活,也乐意为大伙儿做些善事,于是便萌发了把验证码封装成简单的控件发布出去的念头——起初是用ashx(一般处理程序,俗称Httphander)的做法,OK。在WebForm和MVC两种情况下毫无问题——代码很简单,假设把ashx放在程序根目录,那么你就在页面中对应弄上一个img即可:

    <img src="/Image.req"/>

    这样生成img标签自动也会请求这个handler,生成图片(不要忘记配置handler就可以了)。

    然后我想到要做一个dll,因为总觉得把ashx发布出去不是很正规(别人都是发布dll的嘛,呵呵),于是我自己创建了一个类库(ClassLibrary),创建对应的类,实现了IHttpHandler和IRequiresSessionState(拷贝原先ashx中正确的代码,也就是上一篇的代码全部)。然后编译成dll组件,在web.config的<httpHandlers>进行恰当的配置:

    <configuration>
      <system.web>
        <!---Httphandler's configuration here……-->
        <httpHandlers>
          <add path="*.req" verb="*" type="TestLibrary.DrawImage"/>
        </httpHandlers>
    ………………

    然后在WebForm和MVC中同时实验——结果很奇怪:在WebForm一切照旧正常,可是MVC程序中死活就是红叉叉报错(显示不出图片,郁闷中……)

    后来多方请教,直到遇到了大神imran_ku07之后我才恍然大悟(看到 http://forums.asp.net/t/1800318.aspx这篇类似的问题)——原来当你写"/Image.req"的时候,默认路由就会按照“Controller/Action/DefaultOptionalValue”去匹配:这样的话,Controller就变成了“Image.req”,自然没有这个Controller,然后自然报错(图片无法出来)。

    解决办法就是让这个路径不要通过默认的Route方式解析,使用IgnoreRoute方式排除这个路径(粗体):

    [C#]

    public class MvcApplication : System.Web.HttpApplication
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
                routes.IgnoreRoute("{resource}.req/{*pathInfo}");
                routes.MapRoute(
                    "Default", // 路由名称
                    "{controller}/{action}/{id}", // 带有参数的 URL
                    new { controller = "Default", action = "Index", id = UrlParameter.Optional } // 参数默认值
                );
    
            }
    
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                RegisterRoutes(RouteTable.Routes);
            }
        }

    [VB.NET]

    Public Class MvcApplication
        Inherits System.Web.HttpApplication
        Public Shared Sub RegisterRoutes(routes As RouteCollection)
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
            routes.IgnoreRoute("{resource}.req/{*pathInfo}")
            ' 路由名称
            ' 带有参数的 URL
                ' 参数默认值
            routes.MapRoute("Default", "{controller}/{action}/{id}", New With { _
                Key .controller = "Default", _
                Key .action = "Index", _
                Key .id = UrlParameter.[Optional] _
            })
    
        End Sub
    
        Protected Sub Application_Start()
            AreaRegistration.RegisterAllAreas()
            RegisterRoutes(RouteTable.Routes)
        End Sub
    End Class

    这样一来,果然在ASP mvc中也可以咯!神啦!

    “福无双至,祸不单行”——下午某时有个中软的程序员找我询问关于如何屏蔽MVC插件的事情(它的项目根目录有plugin文件夹,然后里边有大量其它重要文件,现在不想要别人访问)。我想了以下,给了两个解决方案:

    1)在根目录web.config中配置如下(相对于根目录的子目录——plugin中后面子文件夹和文件均无法访问)

     <system.web>
        <httpHandlers>
          <add path="/plugin/*" verb="*" type="System.Web.HttpNotFoundHandler"/>
        </httpHandlers>
    ………………

    2)拷贝一个web.config文件到plugin文件夹中,然后这样配置(表示当前文件夹中所有子文件夹和文件均无法访问)

    <system.web>
        <httpHandlers>
          <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
        </httpHandlers>
    ………………

    他的问题是解决了,我又冒出新问题了——既然MVC可以通过:“http://localhost/文件夹名/文件”的形式直接访问文件,那么它为什么不会把“文件夹名”解析成Controller,“文件”解析成Action呢?我猜想如下:

    1)任何网页程序默认“潜规则”解析是根据地址栏输入的虚拟路径寻找对应的文件(传统ASP.NET Web也不例外),因此MVC也有此潜规则——如果地址栏输入的虚拟路径恰好可以映射找到真实的文件,那么直接返回结果,就不会在Route了。

    2)如果找不到:

    2.1)尝试Route(按照默认或者其它定义规则:http://localhost/{Controller}/{Action}/DefaultOptionalParameter)进行解析。

    2.2)如果解析成功,那么返回Action中对应的View,解析失败,抛出异常。

    3)如果某个请求地址(比如Image.req纯粹是一个ashx请求,真实文件路径均不存在),直接使用Route规则匹配肯定错误,此时你就应该告知系统“这是例外”(用IgnoreRoute即可)。

    附加说明:http://visualstudiogallery.msdn.microsoft.com/24ef1a72-6b1c-428a-9908-8990d5d347f2

    我做了一个可以供ASP.NET和MVC使用的验证码控件dll(其中ASP.NET一般页面可以直接使用,MVC的则必须通过一些手动配置才可以使用)。有兴趣可以下载看看哦!

  • 相关阅读:
    linux上运行jmeter-server失败
    转:JMeter整合InfluxDB,Grafana让测试结果实时显示
    转:基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示
    转:Linux下用Jmeter做接口测试
    关于获取IP 电脑获取准确手机获取的IP不准确
    关于MVC微信开发遇到的那些坑。
    uploadify 上传 大文件没有反映
    HTTP 错误 404.3
    关于WEBAPI 的使用 和WEBAPI CORS 的使用过程遇到的问题
    MVC4 ViewModel 存入多个Model,以及前台的显示用法。具体类名可以参数代替
  • 原文地址:https://www.cnblogs.com/ServiceboyNew/p/2486176.html
Copyright © 2011-2022 走看看