`

JAVA:附加码生成器(图片)

    博客分类:
  • java
阅读更多
〔Picture.java〕 


package creator.common.attachLogin; 

import java.io.*; 

public class Picture{ 

final int key=1; 

final String error_format_int= "format of color is not rgb.sample \"212|232|0\""; 

final String error_color_input="format of color(num|num|num): num in 0-255"; 

/**格式化输出数据**/ 

public String manage(String temp){ 

String returnStr=""; 

temp = encrypt(temp); 

byte[] by =temp.getBytes(); 

for(int i=0;i<by.length;i++){ 

returnStr=returnStr+(byte)by[i]+"|"; 

} 

return returnStr; 

} 

/**格式化输入数据**/ 

public byte[] disManage(String temp){ 

int len=0,index=0,i=0,first=0; 

while(( i=temp.indexOf("|",first))>-1){ 

len++; 

first=i+1; 

} 

byte[] by=new byte[len]; 

first=0; 

while(( i=temp.indexOf("|",first))>-1){ 

by[index]=Byte.parseByte(temp.substring(first,i)); 

index++; 

first=i+1; 

} 

return by; 

} 

/**随机生成四位的附加码**/ 

public String getRandom(){ 

int i1 = (int)(java.lang.Math.random()*10); 

int i2 = (int)(java.lang.Math.random()*10); 

int i3 = (int)(java.lang.Math.random()*10); 

int i4 = (int)(java.lang.Math.random()*10); 

return String.valueOf(i1)+String.valueOf(i2)+String.valueOf(i3)+String.valueOf(i4); 

} 

/**加密1:错位处理**/ 

public String encrypt(String randomStr){ 

String para=random()+randomStr.substring(0,1)+random()+random()+randomStr.substring(1,2); 

para= para+random()+randomStr.substring(2); 

return jiaMi(para); 

} 

/**得到随机数0-9之间**/ 

private String random(){ 

String temp = String.valueOf((int)(java.lang.Math.random()*10)); 

return temp; 

} 

/**加密2:加密处理,此方法可以自己修改**/ 

private String jiaMi(String str){ 

byte[] by = str.getBytes(); 

ByteArrayInputStream in = new ByteArrayInputStream(by); 

int ch; 

int index=0; 

byte[] temp = new byte[in.available()]; 

while((ch=in.read())!=-1){ 

temp[index]=(byte)(ch-key); 

index++; 

} 

ByteArrayInputStream ins = new ByteArrayInputStream(temp); 

BufferedReader fReader = new BufferedReader(new InputStreamReader(ins)); 


try{ return fReader.readLine();}catch(Exception e){return "";} 

} 

/**从给的数字里得到正确的数字**/ 

public String discrypt(String temp){ 

String para = jieMi(disManage(temp)); 

return para.substring(1,2)+para.substring(4,5)+ para.substring(6,8); 

} 

/**解密处理**/ 

private String jieMi(byte[] by){ 

ByteArrayInputStream in = new ByteArrayInputStream(by); 

int ch; 

int index=0; 

byte[] temp = new byte[in.available()]; 

while((ch=in.read())!=-1){ 

temp[index]=(byte)(ch+key); 

index++; 

} 

ByteArrayInputStream ins = new ByteArrayInputStream(temp); 

BufferedReader fReader = new BufferedReader(new InputStreamReader(ins)); 

try{ return fReader.readLine();}catch(Exception e){return "";} 

} 

/**分解rgb格式的颜色 num|num|num**/ 

public int[] masterData(String temp){ 

int index_len=0,index=0,next_index=0; 

int[] return_arr=new int[3]; 

boolean break_error=false; 

if(getMax(temp,"|")==2){ 

while((index_len=temp.indexOf("|",next_index))>-1){ 

if(getInt(temp.substring(next_index,index_len))==256){ 

break_error = true; 

}else{ 

return_arr[index]=getInt(temp.substring(next_index,index_len)); 

next_index=index_len+1; 

index++; 

} 

if(break_error) break; 

} 

if(break_error){ 

return null; 

}else{ 

return_arr[index] = getInt(temp.substring(next_index)); 

return return_arr; 

} 

}else{ 

System.out.println(error_format_int+":"+temp); 

return null; 

} 

} 

private int getMax(String temp,String temp2){ 

int index=0,index_len=0,index_next=0; 

while((index=temp.indexOf(temp2,index_next))>-1){ 

index_len++; 

index_next=index+1; 

} 

return index_len; 

} 

private int getInt(String temp){ 

try{ 

return Integer.parseInt(temp); 

}catch(Exception e){ 

System.out.println(error_color_input+":"+temp); 

return 256; 

} 

} 

} 


〔CreateImage.java〕

package creator.common.attachLogin; 


import java.io.*; 

import javax.servlet.*; 

import javax.servlet.http.*; 

import java.awt.*; 

import java.awt.image.*; 

import java.awt.image.BufferedImage; 

import com.sun.image.codec.jpeg.*; 

import com.sun.image.codec.jpeg.JPEGCodec; 


public class CreateImage extends HttpServlet { 

static final private String CONTENT_TYPE = "text/html; charset=gb2312"; 

final String input_back_color_error="input rgb backcolor is error"; 

final String input_fore_color_error="input rgb forecolor is error"; 

private Picture pic = new Picture(); 


//Initialize global variables 

public void init() throws ServletException { 

} 

//Process the HTTP Get request 

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
//生成图片 
try{ 
int imageWidth = 60; 
int imageHeight = 20; 

BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB); 
Graphics graphics = image.getGraphics(); 
graphics.setColor(Color.white); 
graphics.fillRect(0,0,imageWidth,imageHeight); 
graphics.setColor(Color.white); 


FileOutputStream fos = new FileOutputStream("attach.jpg"); 
BufferedOutputStream bos = new BufferedOutputStream(fos); 
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos); 
encoder.encode(image); 
bos.close(); 

}catch(Exception e){ 
System.out.println("生成图片出错!"); 
} 


String queryNum = request.getParameter("Image"); 

String queryRgb=""; 

if(request.getParameter("Rgb")!=null){ 

queryRgb = request.getParameter("Rgb"); 

} 

response.setHeader("Cache-Control","no-store"); 

response.setContentType("image/jpeg"); 

ServletOutputStream out=response.getOutputStream(); 


//jpg格式的背景色图片(于页面风格一样),宽3.6毫米,高1.8毫米 

InputStream imageIn = new FileInputStream(new File("attach.jpg")); 

JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn); 

BufferedImage image4 = decoder.decodeAsBufferedImage(); 

queryNum = pic.discrypt(queryNum); 

Graphics g = image4.getGraphics(); 


if(queryRgb.length()>1){ 

if(pic.masterData(queryRgb)!=null){ 

int[] arg = pic.masterData(queryRgb); 

g.setColor(new Color(arg[0],arg[1],arg[2])); 

} 

}else{ 

g.setColor(new Color(255,0,0)); 

} 

g.drawString(queryNum,0,13); 

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 

encoder.encode(image4); 

out.close(); 

} 


} 



〔web.xml〕


<servlet> 
<servlet-name>CreateImage</servlet-name> 
<servlet-class>javabean.com.CreateImage</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>CreateImage</servlet-name> 
<url-pattern>/servlet/CreateImage</url-pattern> 
</servlet-mapping> 



〔index.jsp〕

<%@page contentType="text/html; charset=gb2312" %>
<%@page import="javabean.com.Picture"%>
<%
Picture pic = new Picture();
String random =pic.getRandom();
String encryRandom= pic.manage(random );
%>
<html>
<head>
<title>登陆窗口</title>
</head>
<body>
<div align="center">
<p align="center">附加码:<input type="attach" size="4">
<img align=absbottom vspace=2 border=0 src="servlet/CreateImage?Image=<%=encryRandom%>&Rgb=255|0|0" title="验证码图片"></p>
<input type="hidden" name="get_attach" value="<%=random%>">
</div>
</body>
</html>


分享到:
评论

相关推荐

    Java获取小程序带参二维码(太阳码)

    Java获取小程序带参二维码(太阳码)调用官方接口B 实现带参二维码获取,下载复制就可使用

    Java 生成校验码及校验码判断

    为了方便在Web项目中使用,你可以创建一个`ChecksumService`,提供生成和验证校验码的接口,然后在控制器或业务逻辑中调用这些服务。 ```java @Service public class ChecksumService { public String generateCRC...

    password-gen:密码生成器

    密码生成器 模组 核 核心密码生成器库。 可以单独作为库分发。 网络API 一个简单的Micronaut Java Web应用程序,它公开了核心密码生成功能。 附加功能 该项目具有一个docker-compose文件,该文件可启动以下命令: ...

    解决动软代码生成器mysql下没有备注

    1. **动软代码生成器**:动软代码生成器(Maticsoft.DbObjects.dll)是一款由动软科技开发的软件,它能够根据数据库中的表结构自动生成C#、Java、ASP.NET等不同编程语言的实体类、DAO层、Service层以及前端展示层的...

    crc16_java_CRC16_

    CRC16(Cyclic Redundancy Check,循环冗余校验)...Java中的实现通过定义生成器多项式、初始化CRC寄存器、进行位移和异或操作,最终计算出CRC16校验码。CRC16.java文件中的`calculateCRC`函数就是这个过程的具体体现。

    mybatis逆向生成器

    此外,MyBatis逆向生成器还可能具备一些附加功能,比如代码模板自定义、注释生成、支持多种数据库类型等。这些特性使得工具更加灵活,能够适应不同项目的需求。 总结来说,MyBatis逆向生成器是一款为MySQL数据库...

    JAVA JVM原理资料

    - **字节码生成器**:生成字节码。 - **JVM**:包括字节码解释器和即时编译器(JIT)。 #### 二、Java语言与平台 1. **Java语言的基本特征**: - 类似C++的语法,但去除了指针运算。 - 静态类型的面向对象系统,...

    java条形码

    Java条形码技术是软件开发中的一个重要组成部分,特别是在零售、物流和库存管理等..."BarCodeHelp.txt"文件是学习和实践这一技术的重要参考资料,通过学习和实践,你可以创建自己的条形码生成器,满足各种业务需求。

    oracle实体类生成器

    Oracle实体类生成器是一款实用的开发工具,专为程序员设计,能够自动生成C#和Java两种编程语言的实体类代码。这款工具对于处理与Oracle数据库交互的项目特别有用,可以显著提高开发效率,减少手动编写数据访问层代码...

    Java Web登录自动填入用户名密码

    如果勾选,就需要生成Cookie并附加到响应中。 3. **设置Cookie**: 创建Cookie对象,键为用户名和密码的哈希值,值为一个标志,如“remembered”,表示用户选择了“记住我”。设置Cookie的过期时间,如果不希望...

    java表达式解析,附加

    3. **编译器与解释器的角色**: 编译器负责将源代码转换为字节码,而解释器则执行这些字节码。在解析表达式时,编译器会检查表达式的语法是否正确,解释器则在运行时计算表达式的结果。 4. **Java的表达式类型**: -...

    Java帮助文档 JDK全系列 官方中英下载地址.docx

    Java Development Kit (JDK) 是Java开发者的核心工具集,包含了编译器、文档生成器、调试器以及其他必要的工具。JDK的不同版本提供了许多新的语言特性和改进,而其帮助文档则为学习和使用Java API提供了巨大帮助。...

    java注解_反射_字节码_类加载机制.zip

    当Java源代码被编译后,生成的就是字节码。字节码使得Java具有跨平台性,因为JVM负责将字节码转换为特定硬件平台的机器指令。字节码也可以被反编译,用于分析代码逻辑或进行动态代码修改,如Java代理。 **类加载...

    Java jdk 86位软件下载

    4. **Java文档生成器**(javadoc):用于从源代码中生成HTML格式的API文档,便于理解和使用Java库。 5. **Java调试器**(jdb):帮助开发人员调试Java应用程序,找出并修复代码中的错误。 6. **Java归档工具**...

    最新Java JDK 11免安装版(Linux 64位)

    4. **Java文档生成器**:javadoc,用于生成API文档,便于开发者了解类库的使用方法。 5. **Java打包工具**:jar,用于创建、管理和提取Java档案(JAR文件),便于代码的分发和部署。 6. **Java调试工具**:包括jdb、...

    java源码查看器(查看.class文件源码)

    这些工具能够解析字节码,重构控制流和数据流,然后生成可读的Java源代码。 Java源码查看器的工作原理大致如下: 1. 读取`.class`文件:工具首先会读取`.class`文件的字节码结构,这包括类信息、方法信息、字段信息...

    java高级应用简笔

    在Java中,注解是一种元数据,用于提供有关程序元素(如类、方法、字段等)的附加信息。注解本身并不改变程序的行为,但它们可以被工具或框架用来指导编译时或运行时的行为。 **1.2 常用注解** - **`@Override`**...

    JAVA基于纠错码的冗余技术的研究EVENODD码的设计与实现(源代码)

    EVENODD码是一种简单的奇偶校验码,它的基本原理是通过在原始数据后附加一个或多个校验位,使得整个数据串(包括原始数据和校验位)的1的个数为奇数或偶数。这种编码方式可以检测到单个错误,但无法确定错误位置,...

    验签生成工具sign.zip

    数字签名并非实际的物理签名,而是一种通过数学算法生成的数字摘要,它附加在数据(如文件或消息)上,可证明数据的完整性和发送者的身份。这个过程涉及到两个步骤:签名和验证。签名者使用自己的私钥对数据的哈希值...

Global site tag (gtag.js) - Google Analytics