知识大全 关于“验证码的制作”的一些补充
Posted 文件
篇首语:怀抱观古今,寝食展戏谑。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于“验证码的制作”的一些补充相关的知识,希望对你有一定的参考价值。
上次写了点关于验证码制作的代码 算是学习了Drawing中的一些东西 心里很快活 也乐意为大伙儿做些善事 于是便萌发了把验证码封装成简单的控件发布出去的念头 起初是用ashx(一般处理程序 俗称Httphander)的做法 OK 在WebForm和MVC两种情况下毫无问题 代码很简单 假设把ashx放在程序根目录 那么你就在页面中对应弄上一个img即可 <img src= /Image req /> 这样生成img标签自动也会请求这个handler 生成图片(不要忘记配置handler就可以了) 然后我想到要做一个dll 因为总觉得把ashx发布出去不是很正规(别人都是发布dll的嘛 呵呵) 于是我自己创建了一个类库(ClassLibrary) 创建对应的类 实现了IHttpHandler和IRequiresSessionState(拷贝原先ashx中正确的代码 也就是上一篇的代码全部) 然后编译成dll组件 在nfig的<Handlers>进行恰当的配置 <configuration> <system web> <! Httphandler s configuration here…… > <Handlers> <add path= * req verb= * type= TestLibrary DrawImage /> </Handlers> …… 然后在WebForm和MVC中同时实验 结果很奇怪 在WebForm一切照旧正常 可是MVC程序中死活就是红叉叉报错(显示不出图片 郁闷中……) 后来多方请教 直到遇到了大神imran_ku 之后我才恍然大悟(看到/t/ 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 _ ntroller = 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文件夹 然后里边有大量其它重要文件 现在不想要别人访问) 我想了以下 给了两个解决方案 )在根目录nfig中配置如下(相对于根目录的子目录 plugin中后面子文件夹和文件均无法访问) <system web> <Handlers> <add path= /plugin/* verb= * type= System Web HttpNotFoundHandler /> </Handlers> …… )拷贝一个nfig文件到plugin文件夹中 然后这样配置(表示当前文件夹中所有子文件夹和文件均无法访问) <system web> <Handlers> <add path= * verb= * type= System Web HttpNotFoundHandler /> </Handlers> …… 他的问题是解决了 我又冒出新问题了 既然MVC可以通过 //localhost/文件夹名/文件 的形式直接访问文件 那么它为什么不会把 文件夹名 解析成Controller 文件 解析成Action呢?我猜想如下 )任何网页程序默认 潜规则 解析是根据地址栏输入的虚拟路径寻找对应的文件(传统ASP NET Web也不例外) 因此MVC也有此潜规则 如果地址栏输入的虚拟路径恰好可以映射找到真实的文件 那么直接返回结果 就不会在Route了 )如果找不到 )尝试Route(按照默认或者其它定义规则//localhost/Controller/Action/DefaultOptionalParameter)进行解析 )如果解析成功 那么返回Action中对应的View 解析失败 抛出异常 )如果某个请求地址(比如Image req纯粹是一个ashx请求 真实文件路径均不存在) 直接使用Route规则匹配肯定错误 此时你就应该告知系统 这是例外 (用IgnoreRoute即可) cha138/Article/program/net/201311/12959相关参考