请教一个jsp问题---在jsp编写的网页里验证码的实现??
请教各位大侠!!!
请教各位大侠!!!
解决方案 »
- 权限管理设计实现思想_请教
- spring切面处理action中的异常
- JSP如何实现分页的处理
- 高分急求:sql生成工具的web版本
- 一个很奇怪的问题,struts+hibernate+myeclipse!分不多,希望各位帮帮忙,进来看看!
- 我用同一个InstallShield程序制作了两个软件的安装程
- 高分求开发过程文档!!要多少分自己说!
- 急:请问哪能下载到jsp上传组件jspsmartupload和相关例子!!Thanks!!!!!在线等.....
- 这个bean写的对吗?
- 求中文显示的解决办法.....
- Tomcat运行一段时间出现 MimeHeaders.setValue MimeHeaders.clear 空指针异常!什么原因造成的呢?
- 想做一个视频播放的板块,不知道要做哪方面工作
import javax.servlet.http.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import javax.imageio.*; /**
* @author jiaoxueli
* <br>Date: 2008-1-14
*/
public class AuthImg extends HttpServlet
{
private Font mFont = new Font("Arial Black", Font.PLAIN, 16);
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++)
{
String tmp = getRandomChar();
sRand += tmp;
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(tmp,15*i+10,15);
} HttpSession session = request.getSession(true);
session.setAttribute("validCode",sRand);
g.dispose();
ImageIO.write(image, "JPEG", response.getOutputStream());
}
private String getRandomChar()
{
int rand = (int)Math.round(Math.random() * 2);
long itmp = 0;
char ctmp = '\u0000';
switch (rand)
{
case 1:
itmp = Math.round(Math.random() * 25 + 65);
ctmp = (char)itmp;
return String.valueOf(ctmp);
case 2:
itmp = Math.round(Math.random() * 25 + 97);
ctmp = (char)itmp;
return String.valueOf(ctmp);
default :
itmp = Math.round(Math.random() * 9);
return String.valueOf(itmp);
}
}
}
jsp页面中这样引用
上面是一个servlet,具体配置不用说了吧。
<servlet>
<servlet-name>image</servlet-name>
<servlet-class>com.lhkj.util.beans.Image</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>image</servlet-name>
<url-pattern>/image</url-pattern>
</servlet-mapping>2.将Image.java导入,与上面配置路径保持一致3.jsp页面中这样用:<td>验证码:</td>
<td><input name="yzma" style="width:60" /> <img src="<%=request.getContextPath() %>/image"></td>
4.action当中的设置:
ManagerLoginForm mf = (ManagerLoginForm) form;
String yzma = mf.getYzma();
// 验证码
String randCode ="0";
if(request.getSession().getAttribute("randCode")!=null){
randCode = request.getSession().getAttribute("randCode").toString();
}
if(yzma.equals(randCode)){
// 调用servic层方法验证登录名密码,返回Manager对象
Manager manager = jigouservice.checkManager(loginName, password);
......
}
}
return mapping.findForward("error");
}
<%@ 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>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);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);// 在内存中创建图象
int width=60, 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(0, 0, width, height);//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
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="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
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
session.setAttribute("rand",sRand);// 图象生效
g.dispose();// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();
%>
<TD bgcolor="#FFFFFF"> <div align="left">
<INPUT NAME="useryz" TYPE="password" class="input" id="useryz" size="7">
<img src="../image.jsp" border=0 align="absmiddle"></div></TD>image.jsp就是上面的页面。
然后用上面的方法就可以导入进来了。
<%--生成验证码图片,contentType必须设置为"image/jpeg"--%>
<%@ page contentType="image/jpeg" pageEncoding="GBK"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.awt.image.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.imageio.*"%><%!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);
}%>
<%
//设置页面不缓存
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)); //画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
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 = "";
for (int i = 0; i < 4; i++) {
String rand = String.valueOf(random.nextInt(10));
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
session.setAttribute("rand", sRand); // 图象生效
g.dispose(); // 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();
%>
2.在你需要显示验证码的页面(如index.jsp)加入<input name=rand type=text id="rand" />img id="randImg" src="image.jsp"/>
3.写一个检查验证码的jsp,将下面代码保存为checkRandomNum.jsp:
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<html>
<%
String randomNumEntered = request.getParameter("randomNumEntered");
String randomNumGenerated = (String) session
.getAttribute("rand"); if (randomNumEntered != null && randomNumGenerated != null) {
if (!randomNumEntered.equalsIgnoreCase(randomNumGenerated)) {
out.print("validate_failed:" + randomNumGenerated);
} else {
//out.println("<center>验证成功!</center>");
out.print("validate_successful:" + randomNumGenerated);
}
}
%>
</html>
4.通过ajax去验证,如果错误,刷新验证码,这里提供一个ajax的封装js,将下面代码保存为ajax.js
/* namespacing object */
var net = new Object();
net.READY_STATE_UNINITIALIZED = 0;
net.READY_STATE_LOADING = 1;
net.READY_STATE_LOADED = 2;
net.READY_STATE_INTERACTIVE = 3;
net.READY_STATE_COMPLETE = 4;
/*--- content loader object for cross-browser requests ---*/
net.ContentLoader = function (url, on_load, on_error, method, params, contentType) {
this.req = null;
this.on_load = on_load;
this.on_error = (on_error) ? on_error : this.defaultError;
this.loadXMLDoc(url, method, params, contentType);
};
net.ContentLoader.prototype.loadXMLDoc = function (url, method, params, contentType) {
if (!method) {
method = "GET";
}
if (!contentType && method == "POST") {
contentType = "application/x-www-form-urlencoded";
}
if (window.XMLHttpRequest) {
this.req = new XMLHttpRequest();
} else {
if (window.ActiveXObject) {
//add try catch;
try {
this.req = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e1) {
try {
this.req = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e2) {
}
}
//
//this.req=new ActiveXObject("Microsoft.XMLHTTP");
}
}
if (this.req) {
try {
var loader = this;
this.req.onreadystatechange = function () {
net.ContentLoader.onReadyState.call(loader);
};
this.req.open(method, url, true);
if (contentType) {
this.req.setRequestHeader("Content-Type", contentType);
}
this.req.send(params);
}
catch (err) {
this.on_error.call(this);
}
}
};
net.ContentLoader.onReadyState = function () {
var req = this.req;
var ready = req.readyState;
if (ready == net.READY_STATE_COMPLETE) {
var httpStatus = req.status;
if (httpStatus == 200 || httpStatus == 0) {
this.on_load.call(this);
} else {
this.on_load.call(this);
}
}
};
net.ContentLoader.prototype.defaultError = function () {
alert("error fetching data!" + "\n\nreadyState:" + this.req.readyState + "\nstatus: " + this.req.status + "\nheaders: " + this.req.getAllResponseHeaders());
};
5.在index.jsp中通过javascript调用ajax去做验证
function refreshRandImg(){
var timenow = new Date().getTime();
document.getElementById("randImg").src="image.jsp?d="+timenow;
}
function checkRandBack() {
var gtext=this.req.responseText;
alert(gtext);
if(gtext.indexOf("validate_successful") != -1){
document.messageForm.submit();
}else{
alert("验证码有误!");
refreshRandImg();
}
}
function submitForm(){
var rand = document.getElementById("rand").value;
if(rand.replace(/(^\s*)|(\s*$)/g, "") == "") {
alert("请输入验证码");
return false;
}
var url="<%=basePath%>page/jsp/checkRandomNum.jsp?randomNumEntered="+rand;
var newxmlhttp=new net.ContentLoader(url,checkRandBack,"","get",null,null);
}你可以下载我上传的资源"jsp+javabean版留言本":http://download.csdn.net/source/737585,里面有用到验证码,可以参考一下
请参考我上传的资源"jsp+javabean版留言本":http://download.csdn.net/source/737585,里面有用到验证码,可以参考一下