菜鸟学Java(六)——简单验证码生成(Java版)

转载自  菜鸟学Java(六)——简单验证码生成(Java版)

验证码大家都知道,它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字、字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素,如各种线条之类的。好了废话不多说一起往下看:



简单的登录页面(代码并不完整,只有验证码部分)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  <head>  <title>验证码</title>  <script type="text/javascript">  
<span style="white-space:pre;"></span><span style="white-space:pre;">   </span> //刷新验证码的js函数    
<span style="white-space:pre;"> </span>function changeCode() {    
<span style="white-space:pre;">     </span>var imgNode = document.getElementById("vimg");                    <span style="white-space:pre;">     </span>//重新加载验证码,达到刷新的目的    
<span style="white-space:pre;">     </span>imgNode.src = "servlet/AuthImageServlet?t=" + Math.random();  // 防止浏览器缓存的问题       
<span style="white-space:pre;"> </span>}      </script>  </head>  <body>  <form action="checkServlet" method="post">  <label>输入验证码</label><br/>  <input type="text" name="randomCode"/><img id="vimg"  title="点击更换" οnclick="changeCode();" src="servlet/AuthImageServlet"><br/>  <input type="submit" value="submit">  </form>  </body>  
</html>  
通过session.getAttribute("rand"),获得生成的验证码,然后跟用户输入的进行比较,再根据比较结果做相应的处理。

通过servlet生成验证码:

package com.util.servlet;  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.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpSession;  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());     }     }  

web.xml中的servlet配置信息:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.5"   xmlns="http://java.sun.com/xml/ns/javaee"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  <servlet>  <servlet-name>AuthImageServlet</servlet-name>  <servlet-class>com.util.servlet.AuthImageServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>AuthImageServlet</servlet-name>  <url-pattern>/servlet/AuthImageServlet</url-pattern>  </servlet-mapping>  <welcome-file-list>  <welcome-file>index.jsp</welcome-file>  </welcome-file-list>  
</web-app>  
就这样验证码的功能就实现了,很简单、很实用。当然还有更加美观,更加严密的方式,有兴趣的朋友可以深入研究。这里就跟大家分享一个比较简单的方式。欢迎各位批评指正。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对象集合中如何用对象的某个属性给对象排序?

这是在工作中遇到的一个问题。用到的持久层技术是mybatis-plus&#xff0c;它里面自带的条件对象wrapper&#xff0c;我们可以通过wrapper.orderByDesc()或者wrapper.orderByAsc()给我们list中的对象排序。 但是问题来了&#xff0c;如果公司在基于这个框架的基础上写了一个通用…

你知道C#中的Lambda表达式的演化过程吗

那得从很久很久以前说起了&#xff0c;记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂。 委托的使用 例一&#xff1a; 什么是委托&#xff1f; 个人理解&#xff1a;用来传递方法的类型。&#xff08;用来传递数字的类型有int、float、double&#xff0c;用…

拦截第三方快递物流 ,console控制台打印正常 ,浏览器显示正常 ,传至后台乱码

使用 apache.http. 可以解决 压缩的json文件 浏览器会自动解压但我们的后台不会package com.zjyouth.utils;import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.…

java面向对象高级分层实例_数据库操作类

package bdqn.studentSys.Dao.impl; /**** 学生表的数据库操作类*/ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import bdqn.studentSys.Dao.BaseDao; import bdqn.studentSys.Dao.StudentDao; import bdqn…

shiro-权限概述

一、什么是权限 权限管理&#xff0c;一般根据系统的安全设置或安全规则&#xff0c;用户可以且只能访问自己被授予的资源。只要有用户名和密码&#xff0c;就一定会存在权限。 二、权限分类 访问权限 作为一个使用者或是访问者&#xff0c;你能够被允许看到的那些资源。 数…

ASP.NET Core Kestrel 中使用 HTTPS (SSL)

在ASP.NET Core中&#xff0c;如果在Kestrel中想使用HTTPS对站点进行加密传输&#xff0c;可以按照如下方式 申请证书 这一步就不详细说了&#xff0c;有免费的和收费的&#xff0c;申请完成之后会给你一个*.pfx结尾的文件。 添加NuGet包 nuget中查找然后再程序中添加引用Micro…

idea

war 发布 war explord 开发

Java最小堆解决TopK问题

转载自 Java最小堆解决TopK问题 TopK问题是指从大量数据&#xff08;源数据&#xff09;中获取最大&#xff08;或最小&#xff09;的K个数据。 TopK问题是个很常见的问题&#xff1a;例如学校要从全校学生中找到成绩最高的500名学生&#xff0c;再例如某搜索引擎要统计每天…

Shiro-概述

一、什么是Shiro shiro是Apache旗下的一个开源框架&#xff0c;将软件系统的安全认证相关功能抽取出来&#xff0c;实现用户身份证&#xff0c;权限授权&#xff0c;加密&#xff0c;会话等功能&#xff0c;组成一个通用的安全认证框架。 二、特点 易于理解的java security …

ASP.NET Core 缓存技术 及 Nginx 缓存配置

前言 在Asp.Net Core Nginx部署一文中&#xff0c;主要是讲述的如何利用Nginx来实现应用程序的部署&#xff0c;使用Nginx来部署主要有两大好处&#xff0c;第一是利用Nginx的负载均衡功能&#xff0c;第二是使用Nginx的反向代理来降低我们后端应用程序的压力。那除了以上两点之…

localStorage、sessionStorage、Cookie的区别及用法

localStorage、sessionStorage、Cookie https://segmentfault.com/a/1190000012057010 localStorage、sessionStorage、Cookie的区别及用法 webstorage webstorage是本地存储&#xff0c;存储在客户端&#xff0c;包括localStorage和sessionStorage。 localStorage localSto…

shiro入门

一、身份认证 基本流程 流程如下&#xff1a; shiro把用户的数据封装成标识token&#xff0c;token一般封装着用户名&#xff0c;密码等信息使用Subject获取到封装着用户的数据标识tokenSubject将token交给SecurityManager&#xff0c;在SecurityManager安全中心中&#xff…

前后端分离开发模式下后端质量的保证 —— 单元测试

概述 在今天&#xff0c; 前后端分离已经是首选的一个开发模式。这对于后端团队来说其实是一个好消息&#xff0c;减轻任务并且更专注。在测试方面&#xff0c;就更加依赖于单元测试对于API以及后端业务逻辑的较验。当然单元测试并非在前后端分离流行之后才有&#xff0c;它很早…

查询近12个月的数据,没有数据的月份补零

可以有两种方法实现&#xff0c;一种是纯sql的方式&#xff0c;一种是sql和代码共用的形式 一、纯sql的形式 前半部分用于一个近12个月的表&#xff0c;然后再将查出来的数据和月份表相结合&#xff0c;就是想要的结果 select v.month,b.price price,ifnull(b.count,0) cou…

java图形验证码生成工具类

转载自 java图形验证码生成工具类生成验证码效果 ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileOutput…

.NET Core中的认证管理解析

0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目&#xff0c;已经准备好了用户注册、登录等很多页面&#xff0c;也可以使用AuthorizeAttribute进行各种权限管理&#xff0c;看起来似乎十分方便。不过生成的代码都替…

散列算法,Remal使用散列算法

一、散列算法 散列算法让其保证不可逆&#xff0c;安全。这里举一个例子sh1的摘要算法。上代码 /*** 散列算法* author Administrator*/ public class HashRsaUtil {/*** 加密方式*/public static final String SHA1"SHA-1";/*** 加密次数*/public static final In…

简化得最没道理的6个汉字,让人大跌眼镜

文章来源于网络&#xff0c;侵删&#xff01;&#xff01;&#xff01; 1、“進”被简化为“进”&#xff0c;“進”字是让人“越走越佳”。 简化字却把它改成了“进”字&#xff0c;让你越走越走到“井”里去了&#xff0c;井底之蛙自生自灭。 2、“廠”被简化为“厂”字&…

c++

#include <iostream> #include<cmath> using namespace std; int main() { int x; double a; double b; while(cin >> x ){//注意while处理多个case for(int i 0 ;i < x ; i ){ cin>>a; …

在docker中运行ASP.NET Core Web API应用程序

本文是一篇指导快速演练的文章&#xff0c;将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤&#xff0c;在介绍的过程中&#xff0c;也会对docker的使用进行一些简单的描述。对于.NET Core以及docker的基本概念&#xff0c;网上已经有很多文章对其进行介绍了&…