package com.bbs.servlet;
創(chuàng)新互聯(lián)-專業(yè)網站定制、快速模板網站建設、高性價比崇州網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式崇州網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋崇州地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
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 com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class Image extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
OutputStream out = response.getOutputStream();
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
int width = 60, height = 20;
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(0, 0, width, height);
// 設定字體
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 隨機產生155條干擾線,使圖象中的認證碼不易被其它程序探測到
g.setColor(getRandColor(180, 200));
for (int i = 0; i 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取隨機產生的認證碼(4位數(shù)字)
String sRand =setRandValue(request);
if(sRand!=null)
for (int i = 0; i sRand.length(); i++) {
g.setColor(new Color(20 + random.nextInt(200), 20 + random
.nextInt(200), 20 + random.nextInt(200)));
// 調用函數(shù)出來的顏色相同,可能是因為種子太接近,所以只能直接生成
g.drawString(sRand.charAt(i) + "", 13 * i + 6, 16);
}
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
// 圖象生效
g.dispose();
// 輸出圖象到頁面
// ImageIO.write(image, "JPG", response.getOutputStream());
out.flush();
out.close();
}
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);
}
//48-57對應0-9;65-90對應A-Z;97-122對應a-z;
String setRandValue(HttpServletRequest request) {
Random random = new Random();
String sRand = "";
//這里是生成驗證碼的位數(shù)
for (int i = 0; i 4; i++) {
char c = 0;
int k = random.nextInt(3);
switch (k) {
case 0:
c = (char) (random.nextInt(10) + 48);
break;
case 1:
c = (char) (random.nextInt(26) + 65);
break;
case 2:
c = (char) (random.nextInt(26) + 97);
}
sRand += c;
}
request.getSession().setAttribute("rands", sRand);
return sRand;
}
}
不知道你問的是不是生成這種圖片驗證碼?如果只要一個隨機四位數(shù) 那這行代碼就夠了(new Random().nextInt(9000) + 1000;),如果是生成頁面圖片驗證碼就是下面的了: //設定 響應模式 resp.setContentType("image/jpeg"); // 生成令牌環(huán)數(shù)據(jù); Integer token = new Random().nextInt(9000) + 1000; // 保存令牌環(huán)數(shù)據(jù)到session中 req.getSession().setAttribute(IMAGE_TOKEN_NAME, token); // 生成令牌環(huán)圖片 ServletOutputStream out = resp.getOutputStream(); BufferedImage img = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB); Graphics g = img.getGraphics(); g.setColor(Color.YELLOW); g.fillRect(0, 0, img.getWidth(), img.getHeight()); g.setColor(Color.BLUE); g.setFont(new Font("", Font.BOLD, 18)); g.drawString(String.valueOf(token), 10, 16); ImageIO.write(img, "jpg", out); out.close();
下面簡單的介紹他們的功能和用途,執(zhí)行效率等。每個都有各自的優(yōu)缺點看你是做甚什么方面的研究開發(fā)用。.net,是網站編程,現(xiàn)在很多都用這個,但是這個語言編程都有統(tǒng)一思路,很好掌握。窒息那個效率不是很高;php 支持跨平臺,很容易學會,執(zhí)行的效率很高;asp是ASP.net的前身,它比較穩(wěn)定,比.net要弱一點。但是比.net好學。jsp 是網頁編程,這個學習大約一周就能搞定,不過這個得多實踐,不然的話,時間長了,就容易忘記。
我自己做的系統(tǒng)里面用作驗證碼的JSP的%@page contentType="image/jpeg;charset=utf-8"%%@page import="java.util.*,java.awt.*,java.awt.image.*,javax.imageio.*" %%@ page import="java.io.OutputStream" %html body %! Color getRandColor(int fc,int bc) { Random rd=new Random(); if(fc255) fc=255; if(bc255) bc=255; int red=fc+rd.nextInt(bc-fc); int green=fc+rd.nextInt(bc-fc); int blue=fc+rd.nextInt(bc-fc); return new Color(red,green,blue); } % % Random r=new Random(); response.addHeader("Pragma","No-cache"); response.addHeader("Cache-Control","no-cache"); response.addDateHeader("expires",0); int width=90; int height=23; BufferedImage pic=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Graphics gc=pic.getGraphics(); gc.setColor(getRandColor(200,250)); gc.fillRect(0,0,width,height); String[] rNum ={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f", "g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w", "x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N", "O","P","Q","R","S","T","U","V","W","X","Y","Z"}; int[] style = {Font.PLAIN,Font.BOLD,Font.ITALIC,Font.PLAIN+Font.BOLD, Font.BOLD+Font.ITALIC,Font.PLAIN+Font.ITALIC,Font.PLAIN+Font.BOLD+Font.ITALIC}; gc.setColor(Color.WHITE); gc.drawLine(0,30,90,10); gc.setColor(getRandColor(160,200)); for (int i=0;i50;i++) { int x = r.nextInt(width); int y = r.nextInt(height); int xl = r.nextInt(10); int yl = r.nextInt(10); gc.drawLine(x,y,x+xl,y+yl); } gc.setColor(getRandColor(60,150)); String rt = ""; for(int i=0;i4;i++){ String temp = rNum[r.nextInt(62)]; rt = rt+temp; gc.setFont(new Font("Times New Roman",style[r.nextInt(7)],15)); gc.drawString(temp,5+i*15+r.nextInt(10),10+r.nextInt(10)); } gc.dispose(); session.setAttribute("randNum",rt); OutputStream os=response.getOutputStream(); ImageIO.write(pic,"JPEG",os); System.out.println("當前驗證碼為:"+session.getAttribute("randNum")); os.flush(); os.close(); os=null; response.flushBuffer(); out.clear(); out = pageContext.pushBody(); % /body/html
現(xiàn)在許多系統(tǒng)的注冊 登錄或者發(fā)布信息模塊都添加的隨機驗證碼功能 就是為了避免自動注冊程序或者自動發(fā)布程序的使用
驗證碼實際上就是隨機選擇一些字符以圖片的形式展現(xiàn)在頁面上 如果進行提交操作的同時需要將圖片上的字符同時提交 如果提交的字符與服務器session保存的不同 則認為提交信息無效 為了避免自動程序分析解析圖片 通常會在圖片上隨機生成一些干擾線或者將字符進行扭曲 增加自動識別驗證碼的難度
在這里 我們使用java實現(xiàn)驗證碼
%@ page contentType= image/jpeg import= java awt * java awt image * java util * javax imageio * %
%!
Color getRandColor(int fc int bc){//給定范圍獲得隨機顏色
Random random = new Random();
if(fc ) fc= ;
if(bc ) bc= ;
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);
}
%
%
//設置頁面不緩存
response setHeader( Pragma No cache );
response setHeader( Cache Control no cache );
response setDateHeader( Expires );
// 在內存中創(chuàng)建圖象
int width= height= ;
BufferedImage image = new BufferedImage(width height BufferedImage TYPE_INT_RGB);
// 獲取圖形上下文
Graphics g = image getGraphics();
//生成隨機類
Random random = new Random();
// 設定背景色
g setColor(getRandColor( ));
g fillRect( width height);
//設定字體
g setFont(new Font( Times New Roman Font PLAIN ));
// 隨機產生 條干擾線 使圖象中的認證碼不易被其它程序探測到
g setColor(getRandColor( ));
for (int i= ;i ;i++)
{
int x = random nextInt(width);
int y = random nextInt(height);
int xl = random nextInt( );
int yl = random nextInt( );
g drawLine(x y x+xl y+yl);
}
// 取隨機產生的認證碼( 位數(shù)字)
String codeList = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ;
String sRand= ;
for (int i= ;i ;i++){
int a=random nextInt(codeList length() );
String rand=codeList substring(a a+ );
sRand+=rand;
// 將認證碼顯示到圖象中
g setColor(new Color( +random nextInt( ) +random nextInt( ) +random nextInt( )));//調用函數(shù)出來的顏色相同 可能是因為種子太接近 所以只能直接生成
g drawString(rand *i+ );
}
// 將認證碼存入SESSION
session setAttribute( rand sRand);
// 圖象生效
g dispose();
// 輸出圖象到頁面
ImageIO write(image JPEG response getOutputStream());
out clear();
out = pageContext pushBody();
lishixinzhi/Article/program/Java/hx/201311/25536