精华内容
下载资源
问答
  • Simple Captcha Plugin : 比较简单的实现了图片显示验证码JCaptcha Plugin :基于 JCaptcha 开源图片和音频验证码项目的Grails插件ReCaptcha Plugin :基于 ReCaptcha 开源图片和音频验证码项目的Grails插件 ...

    在Grails安全验证插件分类中有几个和验证码相关的插件。
    Simple Captcha Plugin  : 比较简单的实现了图片显示验证码
    JCaptcha Plugin :基于 JCaptcha 开源图片和音频验证码项目的Grails插件
    ReCaptcha Plugin :基于 ReCaptcha 开源图片和音频验证码项目的Grails插件

    这次主要介绍如何使用 JCaptcha 插件,因为JCaptcha相对比较成熟和稳定,功能完善可调整的内容也比较丰富。

    安装
    http://plugins.grails.org 网站下载 JCaptcha 插件。
    然后进入你的项目目录, grails install-plugin %path%/grails-jcaptcha-0.2.zip

    这里没有使用Grails的自动安装因为那样很慢,而且Grails自己下载也不支持断点,所以还是自己下载来的方便,特别是比较大的插件。

     

    配置

    在grails-app/conf/Config.groovy 文件中 定义验证器(captchas),

    定义例子如下:

     

    import java.awt.Font
    import java.awt.Color
    import com.octo.captcha.service.multitype.GenericManageableCaptchaService
    import com.octo.captcha.engine.GenericCaptchaEngine
    import com.octo.captcha.image.gimpy.GimpyFactory
    import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator
    import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage
    import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator
    import com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator
    import com.octo.captcha.component.image.color.SingleColorGenerator
    import com.octo.captcha.component.image.textpaster.NonLinearTextPaster
    jcaptchas {
     imageCaptcha = new GenericManageableCaptchaService(
      new GenericCaptchaEngine(
       new GimpyFactory(
        new RandomWordGenerator(
         "abcdefghijklmnopqrstuvwxyz1234567890"
        ),
        new ComposedWordToImage(
         new RandomFontGenerator(
          20, // min font size
          30, // max font size
          [new Font("Arial", 0, 10)] as Font[]
         ),
         new GradientBackgroundGenerator(
          140, // width
          35, // height
          new SingleColorGenerator(new Color(255, 255, 255)),
          new SingleColorGenerator(new Color(200, 200, 200))
         ),
         new NonLinearTextPaster(
          4, // minimal length of text
          4, // maximal length of text
          new Color(11, 11, 11)
         )
        )
       )
      ),
      180, // minGuarantedStorageDelayInSeconds
      180000 // maxCaptchaStoreSize
     ) 
     }

     

     

     

    上面的代码是定义了两个验证器(captcha),一个图形验证器 imageCaptcha ,一个音频验证器 soundCaptcha;
    imageCaptcha使用了自定义的方式,配置了很多参数。默认的图像验证器是 DefaultManageableImageCaptchaService
    soundCaptcha使用了默认的验证器。

     

    你可以配置更多的验证器以及规则,也可以就配置一个,比如这个音频的验证器一般不需要就可以删除掉。如果因为你的业务需要你要一个六字的验证和一个四字的验证,这样的情况就可以配置两个图像验证器。

    ps:我在使用音频验证器时grails报错,因为音频使用到了一些音频处理的API,而我没有这些包,所以删除音频验证器以及涉及音频验证器的包即可。如果你确实需要音频验证器,那就你看错误信息,找到这些包然后放在项目的lib里。

    ps:安装 JCaptcha 插件时会在plugins中安装插件的项目结构,其中也会安装conf/Config.groovy文件。如果运行Grails发生Config.groovy错误,删除插件中的配置文件即可plugins\jcaptcha-0.2\grails-app\conf\Config.groovy

    显示

    完成上面的配置之后,你得到一个验证器名称:imageCaptcha 。然后在需要的gsp页面中使用下面的tag。
    <jcaptcha:jpeg name="<captchaname>"  />
     
    <captchaname>就是你的验证器名称:imageCaptcha

    正常的情况下你就可以看到验证图片了。这个验证图片的颜色,字体,大小,内容都可以通过前面的自定义配置去修改和完善。

    验证

    在控制器中需要验证用户输入的验证码和验证图片中显示的是否一致。首先要在控制器中声明一个jcaptchaService对象,以便spring依赖注入 jcaptchaService 这个类。
    然后在具体的验证Action中使用jcaptchaService.validateResponse("imageCaptcha", session.id, params.code)方法具体验证。
    第一个参数是你的验证器名称。
    第二个参数是比较固定就是 session.id
    第三个参数是 页面中填写验证码输入框的内容,根据你的输入框的名字XXX,params.XXX

    def jcaptchaService    
    def save = {
     def user = new User(params)
            if (!jcaptchaService.validateResponse("captchaName", session.id, params.captchaResponse))
            {
              flash.message = "认证码错误!"
              return render(view:'index',model:[user:user])  
     }
    
     // other logic
    }
    
    

     

     

     

    高级玩法
    前面在配置图像验证器时我们已经发现,我们可以通过配置改变验证图片的很多特性。现在深入看看我们都能改变什么。

    new RandomWordGenerator("") 可以配置随机生成图片内容的字符范围

     

    new ComposedWordToImage(
     new RandomFontGenerator( // 生成图片文字的字体以及字号大小,可以是多种字体,会随机出现。
      20, // min font size
      30, // max font size
      [new Font("Arial", 0, 10)] as Font[]
     ),
     new GradientBackgroundGenerator(// 配置验证图片的大小和背景色以及过渡色
      140, // width
      35, // height
      new SingleColorGenerator(new Color(0, 60, 0)),
      new SingleColorGenerator(new Color(20, 20, 20))
     ),
     new NonLinearTextPaster(
      6, // minimal length of text
      6, // maximal length of text
      new Color(0, 255, 0)
     )
    )

     

    展开全文
  • 在Rails里使用ReCaptcha添加验证码 博客分类: Ruby RailsFlash.netXMLUP 1,去http://recaptcha.net/sign up,获得pub key和priv key 2,安装recaptcha gem Java代码 gem install --...
     
    
    1,去 http://recaptcha.net/sign up,获得pub key和priv key
    2,安装recaptcha gem
    Java代码   收藏代码
    1. gem install --source http://www.loonsoft.com/recaptcha/pkg/ recaptcha  

    3,在environment.rb里设置key
    Java代码   收藏代码
    1. require 'recaptcha'  
    2. RCC_PUB = 'pub key'  
    3. RCC_PRIV = 'priv key'  

    4,修改application.rb
    Java代码   收藏代码
    1. class ApplicationController < ActionController::Base  
    2.   include ReCaptcha::AppHelper  

    5,修改application_helper.rb
    Java代码   收藏代码
    1. module ApplicationHelper  
    2.   include ReCaptcha::ViewHelper  

    6,在页面上显示ReCaptcha验证码
    Java代码   收藏代码
    1. <%= get_captcha %>  

    7,在Controller里验证验证码
    Java代码   收藏代码
    1. if validate_recap(params, @comment.errors) && @comment.save  
    2.   flash[:notice] = 'Comment was successfully created.'  
    3.   format.html { redirect_to post_path(@comment.post.url_slug) }  
    4.   format.xml  { render :xml => @comment, :status => :created, :location => @comment }  

    看了下recaptcha源码,对于本地访问时validate_recap始终为true,对于错误的域名也始终为true

    最终的样子:

    展开全文
  • 1、用panel,label,button,textinput组建布局,如下图: 2、设用户名、密码、验证码所对应的textinput的id分别为...设用于显示验证码的label组建的id为:val. 布局代码如下: 3、生成4位随机数: protected funct

    1、用panel,label,button,textinput组建布局,如下图:

     

    2、设用户名、密码、验证码所对应的textinput的id分别为userName、pasWord、inVal;设用于显示验证码的label组建的id为:val.

         布局代码如下:

     

     <s:Panel x="126" y="98" width="250" height="200" id="login" title="用户登录" includeIn="login">
      <s:Label x="26" y="21" text="用户名:"/>
      <s:Label x="26" y="51" text="密    码:"/>
      <s:TextInput id="userName" x="82" y="19"/>
      <s:TextInput id="pasWord" x="82" y="46"/>
      <s:Button x="26" y="104" label="提交"/>
      <s:Button x="140" y="104" label="重设" />
      <s:Label x="26" y="79" text="验证码:"/>
      <s:TextInput x="82" y="73" width="52" id="inVal"/>
      <s:Label x="140" y="80" id="val" color="red"/>
      <s:Button x="178" y="73" label="换" width="32"/>
     </s:Panel>

     

    3、生成4位随机数:

      protected function valdetorNumber():String
       {
        var digtal1:Number;
        var digtal2:Number;
        var str1:Number;
        var str2:Number;
        var code:String;
        digtal1=Math.random()*10;
        digtal2=Math.random()*10;
        str1=Math.random()*26;
        str2=Math.random()*26;
        code=String.fromCharCode(65+str1)+String.fromCharCode(48+digtal1)
             +String.fromCharCode(65+str2)+String.fromCharCode(48+digtal2);
        
        return code;
       }

     4、将随机数绑定到val:

     

    protected function initApp():void
       {
        val.text=valdetorNumber();
       }

     

    5、网页加载时运行initApp()函数:

     <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
     xmlns:s="library://ns.adobe.com/flex/spark"
     xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
     creationComplete="initApp()">
     

    6、为提交按钮添加click脚本:

    <s:Button x="26" y="104" label="提交" click="button1_clickHandler(event)"/>

     

     protected function button1_clickHandler(event:MouseEvent):void
       {
        if(userName.text==""||pasWord.text=="")
        {
         Alert.show("输入不完整!","提示");
        }else{
        if(userName.text=="bobozai"&&pasWord.text=="1120"&&inVal.text.toLocaleLowerCase()==val.text.toLocaleLowerCase())
        {
              currentState="index";
        }else{
           if(inVal.text!=val.text)
        {
         Alert.show("验证码错误!","提示");
          
        }else{
            Alert.show("用户名和密码不匹配!","提示");
        }
        }
         }
        
       }

     7、为重设添加click脚本:

     

     <s:Button x="140" y="104" label="重设" click="button2_clickHandler(event)"/>

     

     protected function button2_clickHandler(event:MouseEvent):void
       {
        userName.text="";
        pasWord.text="";
        inVal.text="";
       }

     

     8、为换按钮添加click脚本:

     <s:Button x="178" y="73" label="换" width="32" click="button3_clickHandler(event)"/>

     

    protected function button3_clickHandler(event:MouseEvent):void
       {
        valdetorNumber();
        initApp();
       }

     

     所有代码如下:

     

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
     xmlns:s="library://ns.adobe.com/flex/spark"
     xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
     creationComplete="initApp()">

     <fx:Script>
      <![CDATA[
       import mx.controls.Alert;
       protected function initApp():void
       {
        val.text=valdetorNumber();
       }
       protected function button1_clickHandler(event:MouseEvent):void
       {
        if(userName.text==""||pasWord.text=="")
        {
         Alert.show("输入不完整!","提示");
        }else{
        if(userName.text=="bobozai"&&pasWord.text=="1120"&&inVal.text.toLocaleLowerCase()==val.text.toLocaleLowerCase())
        {
              currentState="index";
        }else{
           if(inVal.text!=val.text)
        {
         Alert.show("验证码错误!","提示");
          
        }else{
            Alert.show("用户名和密码不匹配!","提示");
        }
        }
         }
        
       }

       protected function button2_clickHandler(event:MouseEvent):void
       {
        userName.text="";
        pasWord.text="";
        inVal.text="";
       }
       protected function valdetorNumber():String
       {
        var digtal1:Number;
        var digtal2:Number;
        var str1:Number;
        var str2:Number;
        var code:String;
        digtal1=Math.random()*10;
        digtal2=Math.random()*10;
        str1=Math.random()*26;
        str2=Math.random()*26;
        code=String.fromCharCode(65+str1)+String.fromCharCode(48+digtal1)
             +String.fromCharCode(65+str2)+String.fromCharCode(48+digtal2);
        
        return code;
       }
       

       protected function button3_clickHandler(event:MouseEvent):void
       {
        valdetorNumber();
        initApp();
       }

      ]]>
     </fx:Script>
     <s:states>
      <s:State name="login"/>
      <s:State name="index"/>
     </s:states>

     <fx:Declarations>
      <!-- Place non-visual elements (e.g., services, value objects) here -->
     </fx:Declarations>
     <s:Panel x="126" y="98" width="250" height="200" id="login" title="用户登录" includeIn="login">
      <s:Label x="26" y="21" text="用户名:"/>
      <s:Label x="26" y="51" text="密    码:"/>
      <s:TextInput id="userName" x="82" y="19"/>
      <s:TextInput id="pasWord" x="82" y="46"/>
      <s:Button x="26" y="104" label="提交" click="button1_clickHandler(event)"/>
      <s:Button x="140" y="104" label="重设" click="button2_clickHandler(event)"/>
      <s:Label x="26" y="79" text="验证码:"/>
      <s:TextInput x="82" y="73" width="52" id="inVal"/>
      <s:Label x="140" y="80" id="val" color="red"/>
      <s:Button x="178" y="73" label="换" width="32" click="button3_clickHandler(event)"/>
     </s:Panel>
     <s:Label includeIn="index" x="270" y="203" text="欢迎来到主页" fontSize="22"/>
    </s:Application>


     最终效果:

    展开全文
  • flex 验证码

    2011-12-20 13:17:44
    --添加新的组件--> 欢迎来到主页" fontFamily="Georgia" fontSize="20" /> <![CDATA[ import mx.controls.Alert; private function initApp():void{ lblCheckCode.text=GenerateCheckCode(); } ...
    <?xml version="1.0" encoding="utf-8"?>
    
    <mx:Application xmlns:mx="" xmlns="*" layout="vertical" creationComplete="initApp()">
    <mx:states>
    <!--新建“index”State-->
    <mx:State name="index">
    <!--移除“登录框”-->
    <mx:RemoveChild target="{panel1}"/>
    <!--添加新的组件-->
    <mx:AddChild position="lastChild">
    <mx:Label x="231" y="174" text="欢迎来到主页" fontFamily="Georgia" fontSize="20" />
    </mx:AddChild>
    </mx:State>
    </mx:states>
    <mx:Script>
    <![CDATA[
    import mx.controls.Alert;
    private function initApp():void{
    lblCheckCode.text=GenerateCheckCode();
    }
    private function loginHandle():void{
    if(txtUsername.text=="" || txtPassword.text==""){
    Alert.show("用户名或者密码输入不完整!");
    }
    if(txtUsername.text=="licui"&& txtPassword.text=="123" && txtCheckCode.text.toLocaleLowerCase()==lblCheckCode.text.toLocaleLowerCase()){
    currentState="index";
    }else{
    if(txtCheckCode.text.toLocaleLowerCase()!=lblCheckCode.text.toLocaleLowerCase()){
    Alert.show("验证码不正确:");
    lblCheckCode.text=GenerateCheckCode();
    }else{
    Alert.show("用户名或者密码输入不正确!");
    }
    }
    }
    private function resetHandle():void{
    txtUsername.text="";
    txtPassword.text="";
    txtCheckCode.text="";
    }
    private function GenerateCheckCode():String{
    var ran:Number;
    var number:Number;
    var code:String;
    var checkcode:String="";
    //生成四为随机数
    for(var i:int=0;i<4;i++){
    ran=Math.random();
    number=Math.round(ran*1000);
    if(number%2==0)
    code=String.fromCharCode(48+(number%10));
    else
    code=String.fromCharCode(65+(number%26));
    checkcode+=code;
    }

    return checkcode;
    }
    ]]>
    </mx:Script>
    <mx:Panel x="108" y="71" width="349" height="257" layout="absolute" title="用户登录" fontFamily="Georgia" fontSize="12" id="panel1">
    <!-- "用户名"标签 -->
    <mx:Label x="41.5" y="33" text="用户名"/>
    <!-- "密码"标签 -->
    <mx:Label x="42.5" y="81" text="密码"/>
    <!-- "用户名"输入框 -->
    <mx:TextInput x="94.5" y="33" id="txtUsername"/>
    <!-- "密码"输入框 -->
    <mx:TextInput x="95.5" y="81" id="txtPassword" displayAsPassword="true"/>
    <!-- "登录"按钮 -->
    <mx:Button x="82.5" y="159" label="登录" id="btnLogin" click="loginHandle()"/>
    <!-- "重置"按钮 -->
    <mx:Button x="181.5" y="159" label="重置" id="btnReset" click="resetHandle()"/>
    <!-- "校验码"标签 -->
    <mx:Label x="165.5" y="125" id="lblCheckCode" width="42.5" color="#377CD0"/>
    <mx:LinkButton x="216" y="123" label="看不清楚?" id="linkbtnReGenerate" click="lblCheckCode.text=GenerateCheckCode();" fontFamily="Georgia" fontSize="11"/>
    <mx:Label x="39.5" y="123" text="校验码"/>
    <!-- "校验码"输入框 -->
    <mx:TextInput x="96.5" y="121" id="txtCheckCode" width="61" maxChars="4"/>
    </mx:Panel>
    </mx:Application>

    友情链接:珀莱雅 欧诗漫 专卖 [url]http://store.taobao.com/shop/view_shop.htm?mytmenu=mdianpu&utkn=g,2djlrizuga4a1324992712104&user_number_id=372143050[/url]
    展开全文
  • Discuz验证码功能解析

    2020-06-28 16:23:35
    discuz验证码功能主要在\uc_server\lib\seccode.class.php或/source/class/class_seccode.php文件中实现,...在服务器安装了ming库(动态生成flash动画)的情况下,discuz默认使用flash验证码。如果未安装ming,已安装G
  • JCaptcha验证码

    千次阅读 2013-06-04 09:44:46
    JCaptcha Plugin :基于 JCaptcha 开源图片和音频验证码项目的Grails插件 而jcaptcha-1.0终于出来了. 比起0.2轻量了很多, 而且0.2里面有不少无用的东西... 现在grails-app下面主要的文件就剩下JcaptchaController....
  • laravel 验证码

    2016-09-23 09:22:00
    Session::flash('milkcaptcha', $phrase); //生成图片 header("Cache-Control: no-cache, must-revalidate"); header('Content-Type: image/jpeg'); $builder->output(); } 转载于:...
  • laravel5.4生成验证码

    2018-01-25 10:03:08
    总结:本篇博客介绍使用gregwar/captcha实现验证码的具体操作步骤,以及可能遇到的问题和解决办法。 博客第一作者,尊重原创 原文地址:http://www.cnblogs.com/zbokett/p/7287235.html 操作步骤: ...
  • Laravel验证码

    2016-06-23 16:12:00
    // Session::flash('milkcaptcha', $phrase); //生成图片 $builder->output(); } } 在路由中定义  //验证码 Route::get('verification','LoginController@verification'); 在HTML中使用验证码图片: ...
  • laravel的验证码

    2019-09-30 01:26:28
    laravel 拥有composer这个包管理工具 使用相关依赖就变得容易的多 使用验证码,首先php要开启gd库 ...1.在根目录coposer.json添加如下 "require": { ... "gregwar/captcha": "1.*" }, 2.使...
  • laravel 使用验证码

    2017-11-06 17:11:00
    laravel 拥有composer这个包管理工具 使用相关依赖就变得容易的多 使用验证码,首先php要开启gd库 ...1.在根目录coposer.json添加如下 "require": { ... "gregwar/captcha": "1.*" }, ...
  • TP6验证码 session跨域

    2020-07-31 10:58:09
    功能需求: 后台登录时需要添加验证码验证,前后端分离,不同域名。 点我进入官方手册 安装验证码扩展 点我查看验证码安装和使用详情 开启中间件 #文件路径:app/middleware.php <?php // 全局中间件定义文件 ...
  • SSH验证码

    2013-11-05 15:14:31
    然后在JSP中添加一个 超链接 ,这个 超链接 通过调用Javascript直接修改id为picture的src属性,使这个属性值仍然为PictureServlet。这样就行了  
  • (六)play之yabe项目【验证码】 博客分类: ...添加验证码功能 在Application.java中添加一个action:captcha() Java代码 /** *添加验证码 */ publicstaticvoidcaptcha(Stringid){...
  • 在flask中使用验证码

    千次阅读 2018-03-06 22:31:32
    在学习flask web 开发的过程中,终于到了登录注册的界面,之前用PIL制作了自己的验证码,现在终于用上了,在搜集各种资料的情况下。终于初步完成了flask的验证码环节 验证码代码 from PIL import Image, ...
  • laravel中使用验证码

    2018-09-01 13:39:29
    配置:在composer.json文件require项添加 "require":{ "gregwar/captcha":"1.*" }, 执行:composer update 使用:引入命名空间 use Gregwar\Captcha\CaptchaBuilder...
  • laravel 5.4 生成验证码

    2018-01-26 10:43:00
    laravel5.4生成验证码 本文地址:http://www.cnblogs.com/zbokett/p/7287235.html 操作步骤: 1, 在laravel5.4项目根目录下找到 composer.json 这个文件, 添加 "gregwar/captcha": "dev-master" ...
  • 常用js验证码

    2014-03-29 15:31:47
    常用js验证码 1。onabort(ns3,ns4,ie4):当用户终止正在打开的网页时产生该事件。 2。onblur(ns3,ns4,ie3,ie4):某元素失去活动焦点时产生该事件。例如鼠标在文本框中点击后又在文本框外点击时就会产生。...
  • laravel 内部验证码

    2016-06-17 14:44:00
    Session::flash('milkcaptcha', $phrase); //生成图片 header("Cache-Control: no-cache, must-revalidate"); header('Content-Type: image/jpeg'); $builder->output(); } 4.找到登录页面添加如下代码 ...
  • 旋转拖动验证码解决方案

    千次阅读 2020-06-10 12:56:59
    曾几何时,你是否被一个旋转验证码而困扰,没错今日主题——旋转验证码。 之前也是被他伤透了心,研究了好几天的js,想直接通过接口传输直接解决验证码的,然而我失败了,不过这一次,他来了他来了,他带着RotNet...
  • 话说Discuz! X2验证码的产生及验证,本文会有... 1、如何在模板中添加一个验证码 在X2中验证码的模板部分独立为一个模板文件(template/default/common/seccheck.htm),供各个地方调用。 在模板中可以添加如下代码...
  • Play框架:验证码

    千次阅读 2013-11-11 16:38:58
    生成验证码图片 We’ll start to see how we can easily generate a captcha image using Play. Basically we will just use another action, except that it will return a binary stream instead of the ...
  • 1、在laravel项目根目录下找到 composer.json 这个文件,  添加 "gregwar/captcha": "1.*" 到composer.json这个文件中,...3.接下来,就可以正常使用验证码了,先测试验证码是否可以正常显...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,012
精华内容 1,204
关键字:

flask添加验证码