首先在网上搜了下jsp生成验证码的代码,如下:

package com.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
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 ValidateCodeServlet extends HttpServlet {

/**
 * 
 */
private static final long serialVersionUID = 4008416931787800531L;

/**
 * Constructor of the object.
 */
public ValidateCodeServlet() {
 super();
}

/**
 * Destruction of the servlet. <br>
 */
public void destroy() {
 super.destroy(); // Just puts "destroy" string in log
}

/**
 * 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 {

//设置页面不缓存
 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();
 // 设定背景色
 g.setColor(getRandColor(225, 250));
 g.fillRect(0, 0, width, height);
 //设定字体
 g.setFont(new Font("Times New Roman", Font.BOLD, 20));

// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
 Random random = new Random();
 g.setColor(getRandColor(160, 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位数字)
 String sRand = generateWord();
 byte[] cs = sRand.getBytes();
 for (int i = 0; i < 4; i++) {
String a = new String(cs, i, 1);
//  String rand = String.valueOf(random.nextInt(10));
  String rand = a;
//  sRand += rand;
  // 将认证码显示到图象中
  g.setColor(new Color(20 + random.nextInt(110), 20 + random
    .nextInt(110), 20 + random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
  g.drawString(rand, 13 * i + 6, 16);
 }

// 将认证码存入SESSION
 HttpSession session = request.getSession();
 session.setAttribute("valicode", sRand);

// 图象生效
 g.dispose();

// 输出图象到页面
 ImageIO.write(image, "JPEG", response.getOutputStream());

}

/**
 * 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 {
 doGet(request, response);
}

/**
 * 给定范围获得随机颜色
 * @param fc
 * @param bc
 * @return
 */
private 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);
}
private  String generateWord() {  
       String[] beforeShuffle = new String[] {"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" };  
       List list = Arrays.asList(beforeShuffle);  
       Collections.shuffle(list);  
       StringBuilder sb = new StringBuilder();  
       for (int i = 0; i < list.size(); i++) {  
           sb.append(list.get(i));  
       }  
       String afterShuffle = sb.toString();  
       String result = afterShuffle.substring(5, 9);  
       return result;  
   }  
}

自己加工了下,原先是产生随机数,这里我就用一个list集合了

然后是在jsp页面中引用这个servlet,如下:

<img id="servletimg" src="<%=path %>/ValidateCodeServlet" flush="true" onclick="reloadImage()" style="vertical-align: bottom;cursor:pointer"></img>

注:cursor:pointer是变手形,reloadImage()是js方法

function reloadImage(){
document.getElementById('servletimg').src="<%=path %>/ValidateCodeServlet";
}

把相同地址再设置一遍就ok了

jsp验证码页面笔记的更多相关文章

  1. jsp登陆页面验证码在火狐浏览器不能刷新问题处理方案

    jsp登陆页面在火狐浏览器验证码不能刷新问题处理方案: <img src="YzmServlet" onClick="this.src='YzmServlet?ti ...

  2. Jsp之神笔记

    JSP笔记 Tomcatserver port: port就是指的某一个程序网络入口,Tomcat的初始化port为:8080: port的个数:256*256=65536个: 一般常见协议的缺省po ...

  3. myeclipse关闭html,jsp等页面的可视化编辑器

    myeclipse打开html,jsp等页面时,有的是默认用可视化编辑器打开的,这样打开会显得很慢,只要关闭可视化编辑器就会快很多了,方法如下: 1,选择菜单: windows -> prefe ...

  4. @RestController注解下返回到jsp视图页面(转)(转)

    这个问题我也遇到过,下面的方法可以试试 蓝萝卜blu @RestController注解下返回到jsp视图页面 spring4.1中添加了@RestController注解很方便,集成了@Respon ...

  5. jsp编写页面时常见错误提示

    jsp编写页面时常见错误提示 404-->未部署web应用 500-->代码有问题 无法显示网页-->未启动tomcat webRoot-->URL输入有误 web-inf-- ...

  6. JSP中页面定时刷新

    1.JSP中页面定时刷新 <% //页面每隔30秒自动刷新一遍 response.setHeader("refresh" , "30" ); %> ...

  7. MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白

    MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白,症状例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVVAxOT ...

  8. JSP错误页面处理的两种方式

    JSP错误页面处理的两种方式: 方法1(真能针对单一页面生效,不推荐): 出错页面实例 <%@ page language="java" contentType=" ...

  9. 配置Jsp错误页面

    配置Jsp错误页面一般我们有2种做法: (1)在页面中用指令进行配置,即page指令的errorPage和isErrorPage:可以使用page指令的errorPage来指定错误页!在当前JSP页面 ...

随机推荐

  1. Contains Duplicate II 解答

    Question Given an array of integers and an integer k, find out whether there are two distinct indice ...

  2. HDU 3308 LCIS(线段树单点更新区间合并)

    LCIS Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting ...

  3. 剑指offer-面试题6.重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历结果,请重建出该二叉树.假设 输入的前序遍历和中序遍历的结果都不含重复的数字.例如输入前序遍历 序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

  4. 正则表达式、find、grep、awk、sed

    1.正则表达式    (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/.*.?等)组成.   (2)基本元字符集及其含义       ^ :只 ...

  5. go 学习笔记 - sublime text 环境配置

    园里已经有了一篇相当不错的配置说明文章,只是现在gosublime不再支持2.x.文章里的操作在sublimetext3 里一样可以使用 文章地址 : http://www.cnblogs.com/s ...

  6. TRIZ系列-创新原理-32-改变颜色原理

    改变颜色原理的详细描写叙述例如以下:1)改变物体或其环境的颜色:2)改变物体或其环境的透明度:3)对于难以看到的物体或过程.使用颜色加入剂来观測.4)假设已经使用了这样的加入剂,那么使用发光跟踪或原子 ...

  7. Django 从零開始

    1.下载安装django 方法1: pip install Django==1.6.5 測试是否成功安装 : ~$ python import django ~$ (1, 6, 5, 'final', ...

  8. Codevs1992题解

    题目大意 求有向图中经过某一点k的最大环(数据规模不支持floyd). 题解 以k为起点在正向图中spfa求单源最短路.再在反向图中spfa求单源最短路. 枚举除k外的每个点i.假设有一个同一时候包括 ...

  9. 【分割平面,分割空间类题】【HDU1290 HDU2050】

    HDU 2050 折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. Android studio教程:[2]项目整体布局

    上篇介绍了如何创建项目,这一次将介绍创建完的项目如何呈现在开发者的眼前,介绍android studio开发环境的整体布局,让大家知道各个模块的位置和功能. 工具/原料 Android studio ...