servlet验证码

来源:互联网 发布:rnm网络是什么意思 编辑:程序博客网 时间:2024/06/10 12:30


package cn.itcast.demo;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;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 GetImageServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}/** *获得一张图片 */public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {int width = 80;    //验证码的宽度  int height = 40;   //验证码的高度//创建图片 -- 在内存中BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建图层,获得画板Graphics g = image.getGraphics();//确定画笔颜色g.setColor(Color.BLACK);//填充一个矩形g.fillRect(0, 0, width, height);//只需要一个边框//设置颜色g.setColor(Color.WHITE);//填充一个矩形g.fillRect(1, 1, width -2, height -2); //两个黑白块重叠了,效果就是一个黑色边框//填充字符String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";//设置字体g.setFont(new Font("宋体",Font.BOLD,30));//缓存随机生成的字符StringBuffer buf = new StringBuffer();//随机获得4个字符Random random = new Random();for(int i = 0 ; i < 4 ; i++){//设置随机颜色g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));//获得一个随机字符int index = random.nextInt(62);//截取字符串String str = data.substring(index, index + 1);  //[)//需要将随机的字符,写到图片中g.drawString(str, 20 * i, 30);//拼凑验证码内容buf.append(str);}//将获得随机字符串,保存到session// * 获得sessionHttpSession session = request.getSession();// * 保存值session.setAttribute("number", buf.toString());//干扰线for(int i = 0 ; i < 10 ; i ++){//设置随机颜色(可以指定颜色,放在一个数组里)g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));//随机画直线g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));}/** * <extension>jpg</extension>         * <mime-type>image/jpeg</mime-type> *///通知浏览器发送的数据是一张图片response.setContentType("image/jpeg"); //将图片发送给浏览器ImageIO.write(image, "jpg", response.getOutputStream());}}

使用:

<img src="/day07_demo/getImageServlet"/>

使用session保存验证码,要考虑到用户禁用cookie,采用url重写(response.encodeURL(url),本质加上一个;jsessionid=df....)


来自:传智梁桐老师session,cookie的代码

0 0
原创粉丝点击