博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
servlet与jsp实现动态验证码
阅读量:2062 次
发布时间:2019-04-29

本文共 5757 字,大约阅读时间需要 19 分钟。

我们模拟一个简单的登录界面,如果登录成功则跳转到success.jsp,若失败则转发到log.jsp界面并显示错误信息

案例代码如下:

登录界面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>                  My JSP 'log.jsp' starting page    	
<% String error = (String)request.getAttribute("error"); if(error != null) { %>
<%=error%>
<% } %>
method="post">

登陆

用户名:
密码:
验证码:
看不清换一张

验证servlet:

package com.servlet.www;import java.io.IOException;import java.io.PrintWriter;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 LogServlet extends HttpServlet {	public void doGet(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		doPost(request, response);			}	public void doPost(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		request.setCharacterEncoding("UTF-8");		String username = request.getParameter("username");		String password = request.getParameter("password");		String rcode = request.getParameter("rcode");		String s = (String)request.getSession().getAttribute("rcode");		if("weijinhao".equals(username)) {			if("123456".equals(password)) {					if(s.equals(rcode)) {						HttpSession session = request.getSession();						session.setAttribute("username",username);						response.setStatus(302);						response.setHeader("location", response.encodeURL("/day_11-2/jsp/success.jsp"));					}					else {						request.setAttribute("error", "验证码错误");						request.getRequestDispatcher(response.encodeURL("/jsp/log.jsp")).forward(request, response);					}							}			else {				request.setAttribute("error", "密码错误");				request.getRequestDispatcher(response.encodeURL("/jsp/log.jsp")).forward(request, response);			}		}		else {			request.setAttribute("error", "账户名错误");			request.getRequestDispatcher(response.encodeURL("/jsp/log.jsp")).forward(request, response);		}	}}

动态生成验证码的servlet:

package com.servlet.www;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import cn.itcast.vcode.utils.VerifyCode;public class CreateImageTest extends HttpServlet {	public void doGet(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		VerifyCode vc = new VerifyCode();//我们使用这个对象来在内存中划出我们想要的验证码		BufferedImage bi = vc.getImage();//获得验证码		String rcode = vc.getText();//得到验证码的字符串表示		rcode = rcode.toLowerCase();//应为我们输入的验证码都是不区分大小写的所以我们全部转化成小写的		HttpSession s = request.getSession();//我们使用session来实现属性在多个servlet中的传递		s.setAttribute("rcode",rcode);		VerifyCode.output(bi, response.getOutputStream());//输出验证码到请求的位置,因为是图片所以我们输出的是字节流	}}

生成验证码的工具类:

package cn.itcast.vcode.utils;import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;import java.util.Random;import javax.imageio.ImageIO;public class VerifyCode {	private int w = 70;	private int h = 35; 	private Random r = new Random(); 	// {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}	private String[] fontNames  = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};	private String codes  = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";	private Color bgColor  = new Color(255, 255, 255);	private String text ;		private Color randomColor () {		int red = r.nextInt(150);		int green = r.nextInt(150);		int blue = r.nextInt(150);		return new Color(red, green, blue);	}		private Font randomFont () {		int index = r.nextInt(fontNames.length);		String fontName = fontNames[index];		int style = r.nextInt(4);		int size = r.nextInt(5) + 24; 		return new Font(fontName, style, size);	}		private void drawLine (BufferedImage image) {		int num  = 3;		Graphics2D g2 = (Graphics2D)image.getGraphics();		for(int i = 0; i < num; i++) {			int x1 = r.nextInt(w);			int y1 = r.nextInt(h);			int x2 = r.nextInt(w);			int y2 = r.nextInt(h); 			g2.setStroke(new BasicStroke(1.5F)); 			g2.setColor(Color.BLUE); 			g2.drawLine(x1, y1, x2, y2);		}	}		private char randomChar () {		int index = r.nextInt(codes.length());		return codes.charAt(index);	}		private BufferedImage createImage () {		BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 		Graphics2D g2 = (Graphics2D)image.getGraphics(); 		g2.setColor(this.bgColor);		g2.fillRect(0, 0, w, h); 		return image;	}		public BufferedImage getImage () {		BufferedImage image = createImage(); 		Graphics2D g2 = (Graphics2D)image.getGraphics();		StringBuilder sb = new StringBuilder();		// 向图片中画4个字符		for(int i = 0; i < 4; i++)  {			String s = randomChar() + ""; 			sb.append(s); 			float x = i * 1.0F * w / 4; 			g2.setFont(randomFont()); 			g2.setColor(randomColor()); 			g2.drawString(s, x, h-5); 		}		this.text = sb.toString(); 		drawLine(image); 		return image;			}		public String getText () {		return text;	}		public static void output (BufferedImage image, OutputStream out) 				throws IOException {		ImageIO.write(image, "JPEG", out);	}}

转载地址:http://luelf.baihongyu.com/

你可能感兴趣的文章
Chrome扩展插件
查看>>
log4j.xml 日志文件配置
查看>>
如何删除MySql服务
查看>>
BAT Java和Rti环境变量设置
查看>>
NodeJs npm install 国内镜像
查看>>
python3.5.2 mysql Exccel
查看>>
mysqlDump 导出多表,其中部分表有限制数据内容
查看>>
vi 替换方法
查看>>
BAT 相关
查看>>
ANT集成SVNANT访问SVN(Subversion)
查看>>
高可用架构-- MySQL主从复制的配置
查看>>
jvm调优-从eclipse开始
查看>>
构建微服务:Spring boot 入门篇
查看>>
jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
查看>>
Spring boot Myibatis
查看>>
spring boot(七):springboot+mybatis多数据源最简解决方案
查看>>
Spring Boot 笔记
查看>>
maven下手动导入ojdbc6.jar
查看>>
SpringBoot、MyBatis配置多数据源XML方法
查看>>
SpringBoot配置属性之MQ
查看>>