- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java实现验证码具体代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
这里实现我使用到了struts2模拟一个登录功能来验证java实现的验证码功能.
Java实现验证码的步骤:
1、创建RandomImageGenerator.java类,该类实现验证码图片的生成 。
2、创建一个servlet类,RandomImageServlet.java,将生成的验证码输出到页面 。
3、创建一个Action类,LoginAction.java,控制登录 。
4、配置struts.xml一个web.xml文件 。
5、编写页面 。
具体实现用代码表达 。
1、创建RandomImageGenerator.java类 。
。
package com.tenghu.code,
。
import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Random; import javax.imageio.ImageIO,
/** * 验证码生成类 * @author xiaohu * */ public class RandomImageGenerator { //创建Random对象 static Random random=new Random(); //随机生成包含验证码字符串 public static String random(int num){ //初始化种子 String[] str={"0","1","2","3","4","5","6","7","8","9", "a","b","c","d","e","f","g","h","i","j", "k","l","m","n","p","q","r","s","t"}; int number=str.length; //接收随机字符 String text = ""; //随机产生4个字符的字符串 for(int i=0;i<num;i++){ text+=str[random.nextInt(number)]; } return text; } /** * 随机产生定义的颜色 * * @return */ private static Color getRandColor() { Random random = new Random(); Color color[] = new Color[10]; color[0] = new Color(32, 158, 25); color[1] = new Color(218, 42, 19); color[2] = new Color(31, 75, 208); color[3] = new Color(0, 102, 182); color[4] = new Color(171, 0, 85); return color[random.nextInt(5)]; } /** * 产生随机字体 * * @return */ private static Font getFont() { Random random = new Random(); Font font[] = new Font[5]; font[0] = new Font("Ravie", Font.BOLD, 30); font[1] = new Font("Antique Olive Compact", Font.BOLD, 30); font[2] = new Font("Forte", Font.BOLD, 30); font[3] = new Font("Wide Latin", Font.BOLD, 30); font[4] = new Font("Gill Sans Ultra Bold", Font.BOLD, 30); return font[random.nextInt(5)]; } /** * 生成图片 * @throws IOException */ public static void render(String randomStr,OutputStream out,int width,int height) throws IOException{ //在内存中创建图像 BufferedImage bi=new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED); //获取图形上下文 Graphics2D g=(Graphics2D) bi.getGraphics(); //话边框 g.setColor(Color.white); g.fillRect(0, 0, width, height); g.setFont(getFont()); g.setColor(Color.BLACK); //画认证码,每个认证码在不同的水平位置 String str1[]=new String[randomStr.length()]; for(int i=0;i<str1.length;i++){ str1[i]=randomStr.substring(i,i+1); int w=0; int x=(i+1)%3; //随机生成验证码字符水平偏移量 if(x==random.nextInt(7)){ w=30-random.nextInt(7); }else{ w=30+random.nextInt(7); } //随机生成颜色 g.setColor(getRandColor()); g.drawString(str1[i], 20*i+10, w); } //随机产生干扰点,并用不同的颜色表示,事图像的认证码不易被其他程序探测到 for(int i=0;i<100;i++){ int x=random.nextInt(width); int y=random.nextInt(height); Color color=new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)); //随机画各种颜色的线 g.setColor(color); g.drawOval(x, y, 0, 0); } //画干扰线 for(int i=0;i<15;i++){ int x=random.nextInt(width); int y=random.nextInt(height); int x1=random.nextInt(width); int y1=random.nextInt(height); Color color=new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)); //随机画各种颜色线 g.setColor(color); g.drawLine(x, y, x1, y1); } //图像生效 g.dispose(); //输出页面 ImageIO.write(bi, "jpg", out); } public static void main(String[] args) throws FileNotFoundException, IOException { //获取随机字符串 String randomStr=random(5); System.out.println(randomStr); //生成图片 render(randomStr, new FileOutputStream("D:\\test.jpg"),130,40); } } 。
。
2、创建RandomImageServlet.java 。
。
package com.tenghu.code.servlet,
。
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession,
import com.tenghu.code.RandomImageGenerator,
public class RandomImageServlet extends HttpServlet { //图片宽度 int width=0; //图片高度 int height=0; //图片上随机字符个数 int randomStrNum=0; public void destroy() { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //获取HttpSession对象 HttpSession session=request.getSession(); //获取随机字符串 String randomStr=RandomImageGenerator.random(randomStrNum); if(null!=session){ //设置参数 session.setAttribute("randomStr", randomStr); //设置响应类型,输出图片客户端不缓存 response.setDateHeader("Expires", 1L); response.setHeader("Cache-Control", "no-cache, no-store, max-age=0"); response.addHeader("Pragma", "no-cache"); response.setContentType("image/jpeg"); //输出到页面 RandomImageGenerator.render(randomStr, response.getOutputStream(), width, height); } } public void init() throws ServletException { //获取宽度 width=Integer.parseInt(this.getInitParameter("width")); //获取高度 height=Integer.parseInt(this.getInitParameter("height")); //获取个数 randomStrNum=Integer.parseInt(this.getInitParameter("num")); } } 。
。
3、创建LoginAction.java类 。
。
package com.tenghu.code.action,
。
import java.io.ByteArrayInputStream; import java.io.InputStream; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport,
public class LoginAction extends ActionSupport{ //用户名 private String userName; //密码 private String password; //验证码 private String code; private InputStream inputStream; public InputStream getResult(){ return inputStream; } //成功 public String success() throws Exception{ return SUCCESS; } //测试登录 public String testLogin() throws Exception{ //获取图片的验证码 String randomStr=(String) ActionContext.getContext().getSession().get("randomStr"); if(code.trim().equalsIgnoreCase(randomStr)){ if("admin".equals(userName.trim())&&"admin".equals(password.trim())){ //成功 inputStream=new ByteArrayInputStream("1".getBytes("UTF-8")); }else{ //用户名或密码错误 inputStream=new ByteArrayInputStream("2".getBytes("UTF-8")); } }else{ //验证码错误 inputStream=new ByteArrayInputStream("0".getBytes("UTF-8")); } return "result"; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } } 。
。
4、配置struts.xml、web.xml文件 。
。
。
。
<?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> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>RandomImageServlet</servlet-name> <servlet-class>com.tenghu.code.servlet.RandomImageServlet</servlet-class> <!-- 初始化图片宽度 --> <init-param> <param-name>width</param-name> <param-value>130</param-value> </init-param> <!-- 初始化图片高度 --> <init-param> <param-name>height</param-name> <param-value>40</param-value> </init-param> <!-- 初始化图片随机数个数 --> <init-param> <param-name>num</param-name> <param-value>4</param-value> </init-param> </servlet> 。
。
<servlet-mapping> <servlet-name>RandomImageServlet</servlet-name> <url-pattern>/verification.do</url-pattern> </servlet-mapping> <!-- 配置struts核心过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> 。
。
5、编写测试页面 。
。
。
成功页面就部贴出来了,就是一段文字而已 显示结果:
最后此篇关于Java实现验证码具体代码的文章就讲到这里了,如果你想了解更多关于Java实现验证码具体代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!