首先是生成的验证码程序
- package com.cfcc.cms.verification;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ImageServlet extends HttpServlet{
- private static final long serialVersionUID = 1L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
- response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
- response.setHeader("Cache-Control", "no-cache");
- response.setDateHeader("Expire", 0);
- RandomValidateCode randomValidateCode = new RandomValidateCode();
- try {
- randomValidateCode.getRandcode(request, response);//输出图片方法
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
- package com.cfcc.cms.verification;
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics;
- import java.awt.image.BufferedImage;
- import java.util.Random;
- import javax.imageio.ImageIO;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- public class RandomValidateCode {
- public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
- private Random random = new Random();
- private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串
- private int width = 80;//图片宽
- private int height = 26;//图片高
- private int lineSize = 40;//干扰线数量
- private int stringNum = 4;//随机产生字符数量
- /*
- * 获得字体
- */
- private Font getFont(){
- return new Font("Fixedsys",Font.CENTER_BASELINE,18);
- }
- /*
- * 获得颜色
- */
- private Color getRandColor(int fc,int bc){
- if(fc > 255)
- fc = 255;
- if(bc > 255)
- bc = 255;
- int r = fc + random.nextInt(bc-fc-16);
- int g = fc + random.nextInt(bc-fc-14);
- int b = fc + random.nextInt(bc-fc-18);
- return new Color(r,g,b);
- }
- /**
- * 生成随机图片
- */
- public void getRandcode(HttpServletRequest request,
- HttpServletResponse response) {
- HttpSession session = request.getSession();
- //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
- BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
- Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
- g.fillRect(0, 0, width, height);
- g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
- g.setColor(getRandColor(110, 133));
- //绘制干扰线
- for(int i=0;i<=lineSize;i++){
- drowLine(g);
- }
- //绘制随机字符
- String randomString = "";
- for(int i=1;i<=stringNum;i++){
- randomString=drowString(g,randomString,i);
- }
- session.removeAttribute(RANDOMCODEKEY);
- session.setAttribute(RANDOMCODEKEY, randomString);
- System.out.println("图片"+randomString);
- g.dispose();
- try {
- ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /*
- * 绘制字符串
- */
- private String drowString(Graphics g,String randomString,int i){
- g.setFont(getFont());
- g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
- String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
- randomString +=rand;
- g.translate(random.nextInt(3), random.nextInt(3));
- g.drawString(rand, 13*i, 16);
- return randomString;
- }
- /*
- * 绘制干扰线
- */
- private void drowLine(Graphics g){
- int x = random.nextInt(width);
- int y = random.nextInt(height);
- int xl = random.nextInt(13);
- int yl = random.nextInt(15);
- g.drawLine(x, y, x+xl, y+yl);
- }
- /*
- * 获取随机的字符
- */
- public String getRandomString(int num){
- return String.valueOf(randString.charAt(num));
- }
- }
- <input type="text" id="randomCode" name="randomCode"/><img title="点击更换" onclick="javascript:refresh(this);" id = "img" src="../../imageServlet"/><br/>
- function refresh(obj) {
- obj.src = "../../imageServlet?"+Math.random();
- }
- 这里是servlet中的配置,这样加载页面的时候直接就会加载验证码程序了,要注意上面的src要写相对路径到WEB_INF同级
- <servlet>
- <servlet-name>ImageServlet</servlet-name>
- <servlet-class>com.cfcc.cms.verification.ImageServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>ImageServlet</servlet-name>
- <url-pattern>/imageServlet</url-pattern>
- </servlet-mapping>
然后是前台jsp页面的ajax请求部分。
- <span style="white-space:pre"> </span>function isRightCode(){
- //获取请求
- var xmlHttp = null;
- xmlHttp=GetXmlHttpObject();
- if (xmlHttp==null){
- alert ("您的浏览器不支持AJAX!请使用IE浏览器");
- return;
- }
- <span style="white-space:pre"> </span>//我们需要将这部分改变下,这个就是你的输入框的id,通过jquery获取之后,将它设置为name = c 的形式,以供后台getParameter获取
- var code = $("#randomCode").attr("value");
- //alert(code);
- //发出post请求
- xmlHttp.open("POST","../../checkServlet",true);//此处的url需要找到和WEB_INF同级,否则找不到映射的
- xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
- code = "c="+code;
- code = encodeURI(encodeURI(code));
- //请求获取到的结果
- var result;
- xmlHttp.onreadystatechange=function(){
- if (xmlHttp.readyState == 4 && xmlHttp.status == 200){//发送和接受都成功
- result = xmlHttp.responseText;
- result = result.replace(/(^\s*)|(\s*$)/g,'');//去掉因为网络传输出现的空格
- //这里是业务逻辑的处理,即调用ajax之后返回的结果
- if(result == 1){
- alert("验证码为空");
- return false;
- }else if(result == 3){
- alert("验证码不正确");
- refresh(document.getElementById("img"));
- document.getElementById("randomCode").value = "";
- return false;
- }else {
- document.form.submit();
- }
- }else if(xmlHttp.readyState != 4){//正在处理中
- //alert("正在处理中请稍后..........");
- }else if(xmlHttp.status == 404){//未找到页面
- alert("请求页面未找到,请联系维护人员!");
- return;
- } else {//未知错误
- alert("发生未知错误"+ xmlHttp.status +",请联系管理员!");
- return;
- }
- };
- xmlHttp.send(code);
- }
- //获取ajax请求
- function GetXmlHttpObject(){
- var xmlHttp=null;
- try{
- // Firefox, Opera 8.0+, Safari
- xmlHttp=new XMLHttpRequest();
- }catch (e){
- // Internet Explorer
- try{
- xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
- }catch (e){
- xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
- }
- }
- return xmlHttp;
- }
这个弄好页面的处理之后,写后台的处理
- package com.cfcc.cms.verification;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class CheckServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doPost(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //response.setContentType("text/html;charset=utf-8");
- String validateC = (String) request.getSession().getAttribute("RANDOMVALIDATECODEKEY");
- String veryCode = request.getParameter("c");
- //PrintWriter out = response.getWriter();
- //下面的就是将输出输出到页面了,即页面里的result就是这里的输出
- if(veryCode==null||"".equalsIgnoreCase(veryCode)){
- response.getWriter().write("1");//验证码为空
- }else{
- if(validateC.equalsIgnoreCase(veryCode)){
- response.getWriter().write("2");
- }else{
- response.getWriter().write("3"); //验证码不正确
- }
- }
- }
- }
这个类编写好之后,要将web.xml中写上mapping
- <servlet>
- <servlet-name>checkServlet</servlet-name>
- <servlet-class>com.cfcc.cms.verification.CheckServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>checkServlet</servlet-name>
- <url-pattern>/checkServlet</url-pattern>
- </servlet-mapping>
在写这个demo的时候碰到过一个问题,就是开头我是在java程序中处理了验证码正确与否,然后拼成字符串到页面去做处理了,这样会很麻烦,所以应该返回结果去页面处理就可以了。
不要以为验证码的httpservlet和你自己提交的要写一起,实际是分开的,ajax请求的时候是单独写的一个servlet,并且是单独配置的xml。所以在处理完ajax请求之后才去调用submit方法提交后台了。