servlet彩色验证码

博客展示了一段Servlet代码,用于生成验证码。代码将生成的验证码写入session sRand中,还包含随机颜色生成等功能。同时,根据图形环境情况,可选择输出SVG或JPEG格式的验证码,最后提到要在web.xml中加入相关配置。

 servlet代码,代码内容写入session sRand中:

 servlet代码,代码内容写入session sRand中:

package CMCC;

import java.io.*;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.GraphicsEnvironment;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

import javax.imageio.IIOImage;

import javax.imageio.ImageIO;

import javax.imageio.ImageWriter;

import javax.imageio.plugins.jpeg.JPEGImageWriteParam;

import javax.imageio.stream.ImageOutputStream;

import javax.servlet.*;

import javax.servlet.http.*;

/**

 *

 * @author vLua

 * TODO

 * 2004-12-22 16:02:52

 */

public class VerifyCodeServlet extends HttpServlet

{

     private static final int IMAGE_WIDTH = 48;

     private static final int IMAGE_HEIGHT = 18;

     private static final int FONT_HEIGHT = 16;

     private static final String SVG_SOURCE1 = "<!DOCTYPE svg PUBLIC /"-//W3C//DTD SVG 1.0//EN/" /"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd/">"

         + "<svg width=/""

         + IMAGE_WIDTH

         + "/" height=/""

         + IMAGE_HEIGHT

         + "/" xmlns=/"http://www.w3.org/2000/svg/">"

         + "<text x=/"0/" y=/""

         + IMAGE_HEIGHT

         + "/" font-family=/"Arial/" font-size=/""

         + IMAGE_HEIGHT + "/" fill=/"black/">";

     private static final String SVG_SOURCE2 = "</text></svg>";

     /*

      * If graphic environment not avaliable(eg: run under linux console), use

      * svg instead of jpeg.

      */

     private boolean svgMode = false;

     private PrintWriter out = null;

     /*

      * (non-Javadoc)

      *

      * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest,

      *      javax.servlet.http.HttpServletResponse)

      */

     protected void service(HttpServletRequest arg0, HttpServletResponse arg1)

         throws ServletException, IOException

     {

         if (sn == null)

              return;

         String vcode = sn2vcode();

         arg0.getSession().setAttribute("sRand",vcode) ;//代码内容写入session

         if (svgMode)

              outSVG(vcode, arg1);

         else

              outJPEG(vcode, arg1);

     }

     private void outSVG(String vcode, HttpServletResponse resp)

         throws IOException

     {

         resp.setContentType("image/svg+xml");

         resp.getOutputStream().print(SVG_SOURCE1 + vcode + SVG_SOURCE2);

     }

     private void outJPEG(String vcode, HttpServletResponse resp)

         throws IOException

     {

         resp.setContentType("image/jpeg");

         BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT,

              BufferedImage.TYPE_INT_RGB);

         Random random = new Random();

         Graphics g = image.getGraphics();

         g.setColor(getRandColor(200, 250));

         g.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);

         g.setFont(new Font("Times New Roman", Font.HANGING_BASELINE, 18));

         g.setColor(getRandColor(160, 200));

         for (int i = 0; i < 155; i++)

         {

              int x = random.nextInt(IMAGE_WIDTH);

              int y = random.nextInt(IMAGE_HEIGHT);

              int xl = random.nextInt(12);

              int yl = random.nextInt(12);

              g.drawLine(x, y, x + xl, y + yl);

         }

         for (int i = 1; i <= 4; i++)

         {

              String rand = vcode.substring(i - 1, i);

              g.setColor(new Color(20 + random.nextInt(110), 20 + random

                   .nextInt(110), 20 + random.nextInt(110)));

              g.drawString(rand, 13 * (i - 1) + 0, 16);

         }

         ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName(

              "jpeg").next();

         JPEGImageWriteParam params = new JPEGImageWriteParam(null);

         ImageOutputStream ios = ImageIO.createImageOutputStream(resp

              .getOutputStream());

         writer.setOutput(ios);

         writer.write(null, new IIOImage(image, null, null), params);

         writer.dispose();

         ios.close();

     }

     static String sn2vcode()

     {

         String sRand = "";

         Random random = new Random();

         for (int i=0;i<4;i++)

         {

              String rand=String.valueOf(random.nextInt(10));

              sRand+=rand;

         }

         return sRand;

     }

     /*

      * (non-Javadoc)

      *

      * @see javax.servlet.GenericServlet#init()

      */

     public void init() throws ServletException

     {

         try

         {

              GraphicsEnvironment.getLocalGraphicsEnvironment();

         }

         catch (Throwable e)

         {

              //run under linux console???

              svgMode = true;

         }

     }

     /**

      * 获得随机颜色

      * @param fc

      * @param bc

      * @return

      */

     public 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);

     }

}

在web.xml 中加入


 <servlet>
  <servlet-name>VerifyCodeServlet</servlet-name>
  <servlet-class>CMCC.VerifyCodeServlet</servlet-class>
  </servlet>
<servlet-mapping>
<servlet-name>VerifyCodeServlet</servlet-name>
<url-pattern>/VerifyCodeServlet/*</url-pattern>
</servlet-mapping>

调用该servlet用http://hostname/VerifyCodeServlet/即可!

调用<img src=http://hostname/VerifyCodeServlet>

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值