登陆验证码的实现

因为没怎么做网页端的功能,一直不知道登陆验证码是怎么实现的,这次学习梳理一下:

1. web 端展示的是图片,有后台服务(如sevlet返回一个图片)

2. 每次展示/刷新图片,请求一次服务端,web端生成一个唯一ID传到服务端,服务端保存该唯一ID与生成的验证码的对应关系,并返回图片

3. 登陆请求参数包含用户名和密码,唯一ID和用户录入的验证码

4. 登陆后台服务要验证用户录入的验证码与根据唯一ID找到的服务端缓存的验证码是否一致,如果不一致则报错。如果一致,在继续校验用户名和密码是否正确

vue web端代码

通过改变图片的src达到重新请求、刷新图片的目的。刚好我们要传输uuid到服务端

<template>
    <div>
        <h4>{{newsTitle}}</h4>
        <hr>
        <!--  每次uuid的值发送变化则刷新图片-- >
        <img :src="this.codeurl+this.uuid"  @click="getCaptcha()" >
        <button @click="getCaptcha()" >刷新</button>
    </div>
</template>
<script>
    import store from ‘../vuex/store.js‘;
    export default {
        data(){
            return {
                newsTitle :‘验证码‘,
                uuid :‘‘,
                codeurl : "http://127.0.0.1:8088/EasyUI/VerifyCode.do?uuid=",
                currentcode:‘0000‘,
                captchaPath:‘‘
            }
        },
        store,
        methods:{
            getUUID(){
               /* 获取一个唯一ID */
                var uuid =  ‘xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx‘.replace(/[xy]/g, c => {
                        return (c === ‘x‘ ? (Math.random() * 16 | 0) : (‘r&0x3‘ | ‘0x8‘)).toString(16)
                    });
                return uuid;
            },
            getCaptcha(){
                /* 刷新验证码图片 */
                this.uuid = this.getUUID();
                console.log(uuidtmp);
            },
                    },
        mounted(){
            /* 初始化验证码图片 */
            this.uuid = ‘xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx‘.replace(/[xy]/g, c => {
                        return (c === ‘x‘ ? (Math.random() * 16 | 0) : (‘r&0x3‘ | ‘0x8‘)).toString(16)
                    });

        }
    }
</script>

<style>

</style>

服务端代码:servlet 主要是生成随机验证码及其图片

-- 生成图片的代码来源于网络

package Serverlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

    /**
     * Servlet implementation class LoginServlet
     */
    @WebServlet(name="VerifyCode.do", urlPatterns="/VerifyCode.do")
    public class VerifyCodeServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;

        /**
         * @see HttpServlet#HttpServlet()
         */
        public VerifyCodeServlet() {
            super();
            // TODO Auto-generated constructor stub
        }

        /**
         * Initialization of the servlet. <br>
         * @throws ServletException if an error occurs
         */
        public void init() throws ServletException {
            // Put your code here
        }

        /**
         * Destruction of the servlet. <br>
         */
        public void destroy() {
            super.destroy(); // Just puts "destroy" string in log
            // Put your code here
        }

        /**
         * The doGet method of the servlet. <br>
         *
         * This method is called when a form has its tag value method equals to get.
         *
         * @param request the request send by the client to the server
         * @param response the response send by the server to the client
         * @throws ServletException if an error occurred
         * @throws IOException if an error occurred
         */
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {

            this.doPost(request, response);
        }

        /**
         * The doPost method of the servlet. <br>
         *
         * This method is called when a form has its tag value method equals to post.
         *
         * @param request the request send by the client to the server
         * @param response the response send by the server to the client
         * @throws ServletException if an error occurred
         * @throws IOException if an error occurred
         */
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {

            response.setContentType("image/jpeg");
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");

            String uuid = request.getParameter("uuid");

            System.out.println(uuid);

            //声明验证码
            int width = 80;
            int height = 30;
            String data = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz";    //随机字符字典,其中0,o,1,I 等难辨别的字符最好不要
            Random random = new Random();//随机类
            //1 创建图片数据缓存区域(核心类)
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建一个彩色的图片
            //2 获得画板(图片,ps图层),绘画对象。
            Graphics g = image.getGraphics();
            //3 选择颜色,画矩形3,4步是画一个有内外边框的效果
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, width, height);
            //4白色矩形
            g.setColor(Color.WHITE);
            g.fillRect(1, 1, width-2, height-2);

            /**1 提供缓存区域,为了存放4个随机字符,以便存入session */
            StringBuilder builder = new StringBuilder();

            //5 随机生成4个字符

            //设置字体颜色
            g.setFont(new Font("宋体", Font.BOLD&Font.ITALIC, 25));

            for(int i = 0 ; i < 4 ;i ++){
                //随机颜色
                g.setColor(new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255)));

                //随机字符
                int index = random.nextInt(data.length());
                String str = data.substring(index, index + 1);

                //String str = code.substring(i,i+1);

                /**2 缓存*/
                builder.append(str);

                //写入
                g.drawString(str, (width / 6) * (i + 1) , 20);
            }

            //给图中绘制噪音点,让图片不那么好辨别
            for(int j=0,n=random.nextInt(100);j<n;j++){
                g.setColor(Color.RED);
                g.fillRect(random.nextInt(width),random.nextInt(height),1,1);//随机噪音点
            }

            /**3 获得随机数据,并保存session*/
            String tempStr = builder.toString();
            request.getSession().setAttribute("sessionCacheData",tempStr);

            //.. 生成图片发送到浏览器 --相当于下载
            ImageIO.write(image, "jpg", response.getOutputStream());

        }
    }

以上未含包含uuid与验证码的对应关系以及登陆验证的代码

原文地址:https://www.cnblogs.com/gaaban/p/9683590.html

时间: 2024-08-25 20:16:38

登陆验证码的实现的相关文章

phpcms v9后台登陆验证码无法显示,怎么取消验证码

phpcms v9后台登陆验证码无法显示论坛里关于这个问题貌似一直没有解决,查看源代码后发现,关键一点是获取验证码的图片与全局变量SITE_URL相关,也就是网站的目录, 所以只要修改cache/configs/system.php文件中的网站路径变量 ‘web_path’ 即可. 举例说明(本地域名http://localhost) 如果所有的文件都在根目录下(例如apache下的htdocs),此时,默认访问地址应该是http://localhost/,则‘web_path’=>'/',若网

java登陆验证码与JS无刷新验证

最近公司的项目的登陆模块由我负责,所以就做了个登陆小功能进行练手,其包括了用jQuery对用户名和密码进行不为null验证,和出于安全性考虑加了一个验证码的校验 别的不说先上代码 controller层 CreateImage.java package com.controller; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage;

python爬虫解决百度贴吧登陆验证码问题

作为贴吧重度用户,写了个贴吧爬虫脚本 抄了一些别人的代码,记得有个验证码解决的,但是忘了链接了,今天终于自己解决了. 首先要让登陆需要验证码,不停地登陆就好了...度娘很快会加上验证码大法的...需要验证码的情况下,直接登陆返回的错误信息是error=257 打开贴吧首页选择登陆,弹出验证码,找到验证码的链接是 右键在新标签页中打开 注意到链接是 https://passport.baidu.com/cgi-bin/genimage?jxIcaptchaservice+一串字母数字 这个时候根据

登陆验证码的实例

登录验证码 public class VerifyCodeServlet extends HttpServlet { ? ????public void doGet(HttpServletRequest request, HttpServletResponse response) ????????????throws ServletException, IOException { ????????/** ???????? * 1.生成图片 ???????? * 2.记录验证码至Session域中

ASP.NET中登陆验证码的生成和输入验证码的验证

一:验证码的生成实现代码 protected void Page_Load(object sender, EventArgs e)    {        string validateCode = CreateValidateCode();//生成验证码         Bitmap bitmap = new Bitmap(imgWidth, imgHeight);//生成Bitmap图像         DisturbBitmap(bitmap); //图像背景         DrewVa

Ucenter后台登陆 验证码CCCC的解决方法 无法登录解决办法

做同步登录的时候,偶然发现ucenter登录的时候,验证码总是CCCC,太郁闷了,网上找了一下,听说Discuz也有这个问题,不过Discuz的比较好解决,把config.inc.php里面的chekip关掉就可以登陆了, $admincp['checkip'] = 0; // 后台管理操作是否验证管理员的 IP, 1=是[安全], 0=否.仅在管理员无法登陆后台时设置 0.$admincp['tpledit'] = 0; // 是否允许在线编辑论坛模板 1=是 0=否[安全]$admincp[

用struts2做一个带有图片效果的登陆验证码

我们在登陆网站的时候总是会有带有图片验证功能的验证码,它是怎么做出来的了,今天我就详细的将每一步步骤写出来. 1.在action层 1 package cn.itcast.javaee.js.checkcode; 2 3 import java.io.PrintWriter; 4 import javax.servlet.http.HttpServletResponse; 5 import org.apache.struts2.ServletActionContext; 6 import com

问答项目---登陆验证码点击切换及异步验证验证码

输出验证方法: public function verify(){ $config = array( 'length' => 2, 'reset' => false, 'useCurve' => false, 'useNoise' => false, ); $obj = new \Think\Verify($config); $obj->entry(); } 调用: <img src="{:U('verify')}"/ id='code'> &

TP登陆验证码代码

public function chkcode() { $Verify=new \Think\Verify(array( 'fontSize'=>30, //验证码字体大小 'length' =>4, //验证码位数 'useNoise' =>TRUE, //关闭验证码杂点 )); $Verify->entry(); } <tr> <td>验证码:</td> <td> <input type="text" n