zoukankan      html  css  js  c++  java
  • java生成验证码

    1.验证码的作用

    防止黑客对我们的网站进行恶意攻击,例如每个网站都有注册,登入功能,别人可以通过脚本不停的注册账号,那么我们的系统将会崩溃。

    增加了验证码之后,别人再写脚本的时候就必须先识别你的验证码,然而要识别你的验证码图片却不是那么容易的,这样可以有效防止我

    的网站被脚本文件攻击

    1.1 maven需要导入的包

    <dependencies>
            <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha -->
            <!--生成验证码的核心-->
            <dependency>
                <groupId>com.github.penggle</groupId>
                <artifactId>kaptcha</artifactId>
                <version>2.3.2</version>
            </dependency>
    
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.2</version>
            </dependency>
    
        </dependencies>

    1.2 web.xml需要配置的文件

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <servlet>
            <!-- 生成图片的Servlet -->
            <servlet-name>Kaptcha</servlet-name>
            <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
            <!-- 是否有边框-->
            <init-param>
                <param-name>kaptcha.border</param-name>
                <param-value>no</param-value>
            </init-param>
            <!-- 字体颜色 -->
            <init-param>
                <param-name>kaptcha.textproducer.font.color</param-name>
                <param-value>red</param-value>
            </init-param>
            <!-- 图片宽度 -->
            <init-param>
                <param-name>kaptcha.image.width</param-name>
                <param-value>135</param-value>
            </init-param>
            <!-- 图片高度 -->
            <init-param>
                <param-name>kaptcha.image.height</param-name>
                <param-value>50</param-value>
            </init-param>
            <!-- 使用哪些字符生成验证码 -->
            <!--<init-param>
                <param-name>kaptcha.textproducer.char.string</param-name>
                <param-value>ACDEFHKPRSTWX345679</param-value>
            </init-param>-->
            <!-- 字体大小 -->
            <init-param>
                <param-name>kaptcha.textproducer.font.size</param-name>
                <param-value>43</param-value>
            </init-param>
            <!-- 干扰线的颜色 -->
            <init-param>
                <param-name>kaptcha.noise.color</param-name>
                <param-value>black</param-value>
            </init-param>
            <!-- 字符个数 -->
            <init-param>
                <param-name>kaptcha.textproducer.char.length</param-name>
                <param-value>4</param-value>
            </init-param>
            <!-- 使用哪些字体 -->
            <init-param>
                <param-name>kaptcha.textproducer.font.names</param-name>
                <param-value>Arial</param-value>
            </init-param>
        </servlet>
    
        <!-- 映射的url -->
        <servlet-mapping>
            <servlet-name>Kaptcha</servlet-name>
            <url-pattern>/getCode</url-pattern>
        </servlet-mapping>
    
    </web-app>

    1.3  前端的HTML

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="msg" style="color: red"></div>
        <form id="f1">
            账号:<input type="text" name="userName"/><br/>
            密码:<input type="password" name="password"/><br/>
            验证码:<input type="text" name="code"/><br/>
            <img id="code" src="getCode"/><br/>
            <input type="button" value="登陆"/>
        </form>
    </body>
    <script src="js/jquery-3.3.1.min.js"></script>
    <script>
        $(function(){
            //单击图片重新生成验证码图片
            $("#code").on("click",function(){
                //加上随机数,方式get请求缓存
                $(this).prop("src","getCode?"+Math.floor(Math.random()*100));
            });
            //给登陆按钮绑定时间,登陆验证
            $(":button").on("click",function(){
                var params = $("#f1").serialize();
                $.ajax("verifyCode",{
                    type : "post",
                    data : params,
                    success : function(data){
                        if(data.code != 200){
                            $("#msg").text(data.value);
                        }else{
                            location.href = 'index.html';
                        }
                    }
                });
            });
        });
    </script>
    </html>

    1.4 校验验证码的servlet

    package edu.nf.servlet;
    
    import com.google.code.kaptcha.Constants;
    import com.google.gson.Gson;
    import edu.nf.vo.ResponseView;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/verifyCode")
    public class VerifyServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("application/json;charset=utf-8");
    
            ResponseView vo = new ResponseView();
    
            String userName = req.getParameter("userName");
            String password= req.getParameter("password");
            //获取表单的验证码
            String formCode = req.getParameter("code");
            //从会话作用域获取验证码
            String sessionCode = (String)req.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
    
            //校验正好密码以及验证码
            if(!"ywb".equals(userName) && !"123".equals(password)){
                vo.setCode(403);
                vo.setValue("用户名或密码错误");
            }else if(!formCode.equalsIgnoreCase(sessionCode)){
                vo.setCode(403);
                vo.setValue("验证码错误");
            }
            String json = new Gson().toJson(vo);
            resp.getWriter().println(json);
        }
    }
  • 相关阅读:
    HTTPS的七个误解(译文)
    WebLogic 11g重置用户密码
    IT项目管理工具
    Encrypt and Decrypt
    Tomcat Introduction
    浅谈https\ssl\数字证书
    What is POID
    数字签名和数字证书
    Apache Axis2 Practice
    Web Performance Tips
  • 原文地址:https://www.cnblogs.com/ywbmaster/p/10013546.html
Copyright © 2011-2022 走看看