精华内容
下载资源
问答
  • 登陆验证码实现

    2019-09-22 01:09:52
    因为没怎么做网页端的功能,一直不知道登陆验证码怎么实现的,这次学习梳理一下: 1. web 端展示的是图片,有后台服务(如sevlet返回一个图片) 2. 每次展示/刷新图片,请求一次服务端,web端生成一个唯一ID传到...
     

     

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

    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()" alt="">
            <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());
    
            }
        }
    View Code


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

    转载于:https://www.cnblogs.com/gaaban/p/9683590.html

    展开全文
  • 前两天跟一个哥们唠嗑,讨论怎么实现uber, 滴滴的验证码输入的效果。 初构思 方案1: 有打算一个input然后两条线段之间用白背景的线段遮住实现,用letter-spacing控制字间距。 但是控制数字间距吃力点,效果不佳便...

    Web 端 实现 app “输入验证码 ”的效果

    二维码预览
    github.com/useryangtao…

    起因 (只是因为在微信上多唠了两句...)

    前两天跟一个哥们唠嗑,讨论怎么实现uber, 滴滴的验证码输入的效果。

    初构思

    方案1:

    有打算一个input然后两条线段之间用白背景的线段遮住实现,用letter-spacing控制字间距。

    但是控制数字间距吃力点,效果不佳便放弃。

    方案2:

    使用label标签做显示验证码的框,

    然后每个label for属性指向同一个 id 为vcode 的input,

    为了能够触发input焦点, 将input 改透明度样式隐藏,

    这样就实现了 点击label触发 input焦点,调用键盘。

    实现 (后来~ 终于在眼泪中实现... * *)

    最后尝试选择了 方案2

    实现效果

    觉得光标效果挺有意思的,便用 animate 搞了下

    结构

    <div class="v-code">
    <input type="tel" id="vcode" />
    
    <label for="vcode"></label>
    <label... * 5(取决于验证码长度 4 or 6)
    
    </div>
    
    复制代码

    样式

    此处省略 ... 详见 cursor-vcode

    逻辑

    接下来就是实现 让 labelinputvalue 对应,这里依赖 vue 简单实现下思路

    (vue好用不上火,哈哈哈~ ? ? ?)

    html绑定

    <div id="app">
        <div class="v-code">
          <input
          ref="vcode"
          id="vcode"
          type="tel"
          maxlength="6"
          v-model="code"
          @focus="focused = true"
          @blur="focused = false"
          :disabled="telDisabled">
    
          <label
            for="vcode"
            class="line"
            v-for="item,index in codeLength"
            :class="{'animated': focused && cursorIndex === index}"
            v-text="codeArr[index]"
            >
          </label>
        </div>
    </div>
    复制代码

    javascript

    var app = new Vue({
        el: '#app',
        data: {
          code: '', // input value
          codeLength: 6, // 验证码长度
          telDisabled: false, // 判断是否输入完
          focused: false // 让input焦点, 决定光标显示所在的位置
        },
        computed: {
          codeArr() {
            // 将 input value 分隔数组 [1, 2, 3]
            return this.code.split('')
          },
          cursorIndex() {
            // 判断code输入长度,光标显示在对应label上
            return this.code.length
          }
        },
        watch: {
          code(newVal) {
            //限制 非数字
            this.code = newVal.replace(/[^\d]/g,'')
            if (newVal.length > 5) {
            // 禁用 input && 失去焦点 让键盘消失
              this.telDisabled = true
              this.$refs.vcode.blur()
            // submit !!!
              setTimeout(() => {
                alert(`vcode: ${this.code}`)
              }, 500)
            }
          }
        },
        mounted() {}
      })
    复制代码

    考虑交互,在里面多做了部分细节及限制,慢慢品味~

    如有雷同,百分百巧合

    预览

    二维码预览

    github地址:

    github.com/useryangtao…

    转载于:https://juejin.im/post/5acc3a3f51882555867fbe8a

    展开全文
  • java--验证码实现

    热门讨论 2017-06-15 09:24:11
    验证码: 主要用于防止猜测密码,很多软件通过自动猜测密码的方式来破解密码,如果设置了验证码,那么黑客编写的软件就不能正确识别验证码,从而实现不能通过软件尝试破解...怎么用? 1、配置web.xml文件: AuthImag

    验证码:

    主要用于防止猜测密码,很多软件通过自动猜测密码的方式来破解密码,如果设置了验证码,那么黑客编写的软件就不能正确识别验证码,从而实现不能通过软件尝试破解密码的作用,我们在登录系统时,需要输入验证码,它延长了操作者的时间对用户体验很不利,为什么这么多网站还要用呢?欢迎访问博客:验证码有什么用?为什么要用验证码?


    怎么用?

    1、配置web.xml文件:

    <servlet>
    	<servlet-name>AuthImageServlet</servlet-name>
    	<servlet-class>com.orcl.drp.util.servlet.AuthImageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        	<servlet-name>AuthImageServlet</servlet-name>
        	<url-pattern>/servlet/AuthImageServlet</url-pattern>
     </servlet-mapping>


    2、AuthImageServlet类代码:

    public class AuthImageServlet extends HttpServlet   
    {   
      
        private static final String CONTENT_TYPE = "text/html; charset=gb2312";   
        //设置字母的大小,大小   
        private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);   
        public void init() throws ServletException   
        {   
            super.init();   
        }   
        Color getRandColor(int fc,int bc)   
        {   
            Random random = new Random();   
            if(fc>255) fc=255;   
            if(bc>255) bc=255;   
            int r=fc+random.nextInt(bc-fc);   
            int g=fc+random.nextInt(bc-fc);   
            int b=fc+random.nextInt(bc-fc);   
            return new Color(r,g,b);   
        }   
      
        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException   
        {   
            response.setHeader("Pragma","No-cache");   
            response.setHeader("Cache-Control","no-cache");   
            response.setDateHeader("Expires", 0);   
            //表明生成的响应是图片   
            response.setContentType("image/jpeg");   
               
            int width=100, height=18;   
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);   
               
            Graphics g = image.getGraphics();   
            Random random = new Random();   
            g.setColor(getRandColor(200,250));   
            g.fillRect(1, 1, width-1, height-1);   
            g.setColor(new Color(102,102,102));   
            g.drawRect(0, 0, width-1, height-1);   
            g.setFont(mFont);   
      
            g.setColor(getRandColor(160,200));   
      
            //画随机线   
            for (int i=0;i<155;i++)   
            {   
                int x = random.nextInt(width - 1);   
                int y = random.nextInt(height - 1);   
                int xl = random.nextInt(6) + 1;   
                int yl = random.nextInt(12) + 1;   
                g.drawLine(x,y,x + xl,y + yl);   
            }   
      
            //从另一方向画随机线   
            for (int i = 0;i < 70;i++)   
            {   
                int x = random.nextInt(width - 1);   
                int y = random.nextInt(height - 1);   
                int xl = random.nextInt(12) + 1;   
                int yl = random.nextInt(6) + 1;   
                g.drawLine(x,y,x - xl,y - yl);   
            }   
      
            //生成随机数,并将随机数字转换为字母   
            String sRand="";   
            for (int i=0;i<6;i++)   
            {   
                int itmp = random.nextInt(26) + 65;   
                char ctmp = (char)itmp;   
                sRand += String.valueOf(ctmp);   
                g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));   
                g.drawString(String.valueOf(ctmp),15*i+10,16);   
            }   
      
            HttpSession session = request.getSession(true);   
            session.setAttribute("rand",sRand);   
            g.dispose();   
            ImageIO.write(image, "JPEG", response.getOutputStream());   
        }   
        public void destroy()   
        {   
        }   
    }  

    3、jsp页面关键代码:

    String authCode = request.getParameter("authCode");
    //输入的与session中作比较,忽略大小写
    if (!authCode.trim().equalsIgnoreCase((String)session.getAttribute("rand"))) {
    	out.println("验证码不正确!");
    }
    <TD align=left><FONT face="verdana, arial, helvetica, sans-serif"
            size=-1>验证码:</FONT>
    </TD>
    <TD align=left>
            <INPUT name="authCode" type="text" size="6" maxlength="6">
    
            <img src="${pageContext.request.contextPath }/servlet/AuthImageServlet">
    </TD>

    实现效果:






    展开全文
  • 可能大家对于豆瓣并不怎么了解,我给大家简单介绍一下。 豆瓣是一个社区网站,该网站以书影音起家,提供关于书籍、电影、音乐等作品的信息,无论描述还是评论都由用户提供(User-generated content,UGC),是Web ...

    前言:

     

    更为重要的一件事情是它是纯Python编程语言开发的!!!

    所以咱们利用Python去搞定它的验证码实现模拟登陆,是有一定意义的哟!

    投机取巧,利用Python解决豆瓣验证码,实现模拟登陆!

     

    实战:

    • Python 3.6.5 解释器
    • pycharm 编辑器
    • selenium 模块

    其实利用selenium模拟登陆没什么难度的,关键在于这个豆瓣的验证码要怎么办。

    经过我多次截图发现了一些规律,如下所示:

    投机取巧,利用Python解决豆瓣验证码,实现模拟登陆!

     

    投机取巧,利用Python解决豆瓣验证码,实现模拟登陆!

     

    验证码方块离左边的距离永远相等,只有Y轴上下有一点变化,但是这个重要吗?

    然后方块离凹槽的距离偏差只有10PX左右,那么你懂了吗?

    我们只需要往右边每次移动相同的距离就可以了。然而前面所说的10px其实大家应该都懂,那个是可以忽略不计的,正常人去滑动验证码,他偶尔也有一点点偏差,没有完全重合也会提示成功!(阈值)

     

    投机取巧,利用Python解决豆瓣验证码,实现模拟登陆!

     

    当然我最后去试了下,并不能够成功。确实滑到了位置上,但是它提示网络波动!

    这可为难不了我,我一下就想到这个是检测到我了,因为 机器滑动是急速的,和正常人滑动是有区别的,正常人滑动应该是先加速,再减速!你可以称这个技术为轨迹。

     

    投机取巧,利用Python解决豆瓣验证码,实现模拟登陆!

     

     

    以下为Python匀加速代码:

    def get_tracks(distance):
        '''
        拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
        匀变速运动基本公式:
        ①v=v0+at
        ②s=v0t+½at²
        ③v²-v0²=2as
    
        :param distance: 需要移动的距离
        :return: 存放每0.3秒移动的距离
        '''
        # 初速度
        v = 0
        # 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移
        t = 0.3
        # 位移/轨迹列表,列表内的一个元素代表0.2s的位移
        tracks = []
        # 当前的位移
        current = 0
        # 到达mid值开始减速
        mid = distance*4/5
    
        while current < distance:
            if current < mid:
                # 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细
                a = 2
            else:
                a = -3
    
            # 初速度
            v0 = v
            # 0.2秒时间内的位移
            s = v0*t+0.5*a*(t**2)
            # 当前的位置
            current += s
            # 添加到轨迹列表
            tracks.append(round(s))
    
            # 速度已经达到v,该速度作为下次的初速度
            v = v0 + a*t
        return tracks
    展开全文
  • 所以一个成熟的web项目怎么能少了验证码呢?不过自己编写实现好像对我来说,有点困难阿。不过没关系,我们也可以使用一些比较方便的验证码工具,省时省力。在网上收集一些资料之后,决定使用Kaptcha组件。 一、...
  •  那他们到底是怎么实现的呢??? 据本人猜测,应该都是基于近2年流行的深度学习算法来实现的!因为毕竟目前深度学习最擅长图片、文字等处理。。 为验证该猜想,作为一名深度学习业余爱好者和门外汉,我也尝试整...
  • python处理图片验证码

    2017-03-04 00:50:00
    WebDriver中实现对特定的Web区域截图方法 import pytesseract from PIL import Image image=Image.open('new.jpg') ...二、但在使用python自动化测试中会遇到一个难点,验证码怎么获取,python的webdr...
  • 验证码生成实例

    2011-09-07 16:16:43
    [size=large]作web总会要用到验证码!刚开始感觉这个东西挺难的,慢慢的感觉这个其实比较简单,只要写多了,感觉也就那么回事。我对他的理解是,首先要搞清实现他的一个基本思路,然后了解实现他的个别方法。这个就...
  • 首先创建一个maven web工程,目录结构如下 **用逆向工程,生成一下,但是我们发现了一个问题,是不是每个mapper都有默认的公共的方法,我们要把这些给提出来卸载base层里面,应该怎么做呢?我们定义一个泛型的接口...
  • 浅谈 Java web 项目实现手机号登录

    千次阅读 2018-04-24 11:54:59
    手机号登录 则是需要根据手机号去判断验证码是否正确(我这里是将验证码存入ehcache缓存,然后对比用户输入的验证码),然后将手机号关联的用户查出来 存入session ,然后访问登录页的时候才不会被...
  • JAVA实践生成验证码图片

    千次阅读 2016-08-03 13:20:25
    前言以前一直很好奇,验证码怎么做出来的,我会PS的时候,一致认为是PS画的,最近在玩Web,然后发现too young了,原来是代码生成的。实现参考的博客作者: 永恒の_☆ 博客地址: ...实现参考关键词参考: ...
  • 有网友问起, 前后端分离 架构下的 Web 单点验证 怎么做, 我画了个图 : Temp Token 就 相当于 短信验证码Web 单点登录 都可以用这个 模型, 不仅仅是 前后端分离 。 转载于:...
  • Web自动化跳过登录背景思路方法代码总结 背景 自动化模拟登录,遇到图形验证码或者动态验证码时,代码操作复杂。该怎么跳过登录? 思路 研究文档发现,selenium有add_cookie()方法 方法 driver.add_cookie({'name': ...
  • 网页验证码的产生和判断

    千次阅读 热门讨论 2013-08-22 19:37:22
    那他是怎么实现的呢?咱们就看看吧。。。  首先建立一个一般处理程序,如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Drawing; using S
  • <code>POST https://web.sanguosha.com/auth/bind_new/phone_code.php acount=<...&session=...POST https://web.sanguosha.com/auth/bind_new/phone_bind.php ...收到的验证码></code></pre>  </p>
  • 今天突然看到刚学Java Web时,做的一个模拟验证码验证过程,没考虑安全问题,只为了功能的实现,今天将它整理一下。 首先放两张效果图 一上来就是这样啦 点击验证的话 会出来验证码框 啊哈哈 虽然是之前做的 ...
  • 3.{"res":"1003"} 验证码已经过期 4.{"res":"1004"} 验证码无效 5.{"res":"1005"} 重复提交 6.{"res":"1006"} 缺少参数 2、用户登录 参数名称 参数说明 长度要求 可选/必须 m 值为0x5702 必须 phone 用户...
  • 在最初决定搞Web开发的时候就思考过网站上的验证码怎么实现的,后来在一些专业书籍上也看过一些介绍,但并没有自己去实现过。在www.51aspx.com上下载了一些源码研究过,感觉都不是很满意,一直都想找一个可以直接...
  •  在最初决定搞Web开发的时候就思考过网站上的验证码怎么实现的,后来在一些专业书籍上也看过一些介绍,但并没有自己去实现过。在www.51aspx.com上下载了一些源码研究过,感觉都不是很满意,一直都想找一个可以...
  • 源码参考:2、如何用Ajax和Servlet实现分页①分页数据显示怎么实现②创建XML对象与建立连接③如何运用ajax技术实现首页显示④Servlet获得数据库数据并重定向回主页⑤最后就是超链接的分页选项跳转的实现总结 ...
  • 通过大量循序渐进的案例,让学生在体验中掌握Java Web 相关知识,同时获得编程能力、排错能力和学习能力,《Java Web 开发就该这样学》多次使用陷阱式教学法,帮助学生深刻理解所学知识,掌握实现Web 编程的不同技术...
  • Golang实现正方教务系统爬虫(一)

    千次阅读 2017-09-17 13:49:58
    大二上学期的时候用python实现过一个简单的爬虫,学了go以后发现go的标准库十分强大,于是想实现一个教务系统的爬虫,爬取学分和成绩页面,再搞一个web界面出来. 项目github地址:...
  • 在子线程中更新UI,自动填写验证码 内网穿透,真机安装运行体验 如果把这个版本的登录注册掌握了,基本的前后端联合开发就可以入门了。 正文 一、Gradle依赖 1、Gradle版本号问题 本来Android布局应该是在第一的...
  • 46.曾删改报错注入+怎么找这种漏洞.mp4 47.其他数据库的注入.mp4 2.xss 48.什么是XSS发送ajax实现跨域.mp4 49.理解ajax同异步之学员争辩.mp4 50.存储XSS.mp4 51.反射XSS.mp4 52.domxss.mp4 53.XXSSProtection.mp4 54...
  •  继承Captcha实现out方法,中文验证码可继承ChineseCaptchaAbstract,算术验证码可继承ArithmeticCaptchaAbstract。 8.更新日志 2019-08-23 (v1.6.2) 增加10种漂亮的内置字体,不依赖系统字体 增加算术...
  • 学了这么久的web应用,一直都没时间去做一点,相对复杂点得应用,比方如今要考虑的图片上传,或者是接下来要加强学习的正則表達式、防SQL注入、验证码实现、图片水印功能等,这的确是应该作为我学习的第二个阶段,...
  • 多方面面试

    千次阅读 2010-07-20 20:34:00
    如同步调用和异步调用 4、开发模式,如Singleton   Asp.Net方面:   1、httprequest对象 2、response对象 3、图形验证码实现 4、http编程,如怎么发送http请求并获取...
  • Json Web Token(JWT) Quartz:定时任务 Beetl:模版引擎 代码生成使用 Thymeleaf:发送模版邮件使用 Hutool:Java工具包 Jasypt:配置文件加密(thymeleaf作者开发) Swagger2:Api文档生成 MySQL Nginx Maven ...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

web验证码怎么实现