Servlet的应用---验证码

使用Servlet实现网页验证码功能。

1. 编写一个Servlet,实现以下功能:

(1)能够响应来自客户端的GET请求,不响应POST和其他请求;

(2)请求的url-pattern为“/checkcode”;

(3)响应请求时,向浏览器改善验证码图片,验证码由4位字符组成,字符可以是26个英文字母和10个数字。

(4)同时将验证码字符串放入session中,以便将来客户端提交验证码时检查是否一致。

2. 编写一个login.jsp,测试验证码是否有效。

(1)用户输入正确的验证码,则提示验证码正确;否则提示错误。然后继续显示一个新的验证码。

(2)用户点击验证码图片时,更换一个新的验证码。


servlet的具体代码:

package com;

import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
//import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.util.Random; 

/**
 * Servlet implementation class ValidateCode
 */
//@WebServlet("/ValidateCode")
public class ValidateCode extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	public static final int CODE_LENGTH = 4;        //验证码长度   
    public static final int SINGLECODE_WIDTH = 15;  //单个验证码宽度   
    public static final int SINGLECODE_HEIGHT = 30; //单个验证码高度   
    public static final int SINGLECODE_GAP = 4;     //单个验证码之间间隔   
    public static final int IMG_WIDTH = CODE_LENGTH * (SINGLECODE_WIDTH + SINGLECODE_GAP);  
    public static final int IMG_HEIGHT = SINGLECODE_HEIGHT;  
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ValidateCode() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		char[] codes = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ,'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
        		'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
        		'X', 'Y', 'Z',}; 
    	//设置图片的高、宽、类型
    	BufferedImage Img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_BGR);
    	Graphics2D g = Img.createGraphics();     //获取到绘图对象
    	//将验证码图像背景填充为白色
    	g.setColor(Color.WHITE); 
    	g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT); 
    	//将画笔颜色设置为黑色,用来写字   
        g.setColor(Color.BLACK);  
      //设置字体:宋体、不带格式的、字号   
        g.setFont(new Font("宋体", Font.PLAIN, SINGLECODE_HEIGHT + 5)); 
        Random random =new Random();
      //随机生产20跳图片干扰线条,使验证码图片中的字符不被轻易识别
        for(int i = 0; i < 20; i++) {  
            int x = random.nextInt(IMG_WIDTH);  
            int y = random.nextInt(IMG_HEIGHT);  
            int x2 = random.nextInt(IMG_WIDTH);  
            int y2 = random.nextInt(IMG_HEIGHT);  
            g.drawLine(x, y, x + x2, y + y2);  
        }
        StringBuffer randomCode=new StringBuffer();
        for (int i = 0; i < CODE_LENGTH; i++) {
			String str= String.valueOf(codes[random.nextInt(36)]);
			//画出一个字符串:要画的内容,开始的位置,高度   
			g.drawString(str, i * (SINGLECODE_WIDTH + SINGLECODE_GAP)+ SINGLECODE_GAP / 2, IMG_HEIGHT);
			randomCode.append(str);
		}
        
     // 将生产的验证码保存到Session中
        HttpSession session=request.getSession();
    	session.setAttribute("validate", randomCode.toString());
    	// 设置图像缓存为no-cache。
    	response.setHeader("Pragma", "no-cache"); 
    	response.setHeader("Cache-Control", "no-cache"); 
    	response.setDateHeader("Expires", 0); 
    	
    	//将最终生产的验证码图片输出到Servlet的输出流中
    	ServletOutputStream sos = response.getOutputStream(); 
    	ImageIO.write(Img, "jpeg", sos); 
    	sos.flush();
    	sos.close(); 
	}

}

xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>homework6</display-name>
	
	<servlet>
		<servlet-name>ValidateCode</servlet-name>
		<servlet-class>com.ValidateCode</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>ValidateCode</servlet-name>
		<url-pattern>/checkcode</url-pattern>
	</servlet-mapping>
</web-app>

login.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>验证码</title>
<script>
	function reflesh(obj) {
		obj.src = 'checkcode?d=' + new Date();
	}
</script>
</head>
<body>
	<form name="checkcode" method="get" action="">
		<input type="text" name="validatecode"> <img alt="图片不能显示"
			src="checkcode" id="codeImg" οnclick="reflesh(this)" title="看不清请刷新" />
		<input type="submit" name="check" value="check">
	</form>
</body>
<%
	if (request.getParameter("check") != null) {
		String str1 = session.getAttribute("validate").toString();
		String str2 = request.getParameter("validatecode");
		str2=str2.toUpperCase();
		if (str1.equals(str2))
			out.print("输入正确");
		else
			out.print("验证码不正确,请重新输入!");
	}
%>
</html>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二.根据根据1)完善以下代码,完成用户手机号码在后台数据库是否存在的校验,后台servlet地址为exist,采用异步的方式,交互采用JSON字符串,返回格式{“flag”:“t”}如果不存在,则允许提交,否则不允许提交(返回结果1表示存在,-1表示不存在)。的ajax请求,编写servlet接收并处理前端传递的手机号码数据,并返回验证码(共20分)。 1)补全以下Servlet类,接收上题表单所提交的数据,调用com. dao 目录下的checkLoginExistDao 的checkIsExist(Stirg tel, String code)方法,该方法用于访问数据库,根据方法所具有的参数,如果数据库发送的手机验证码和手机号对应匹配,则返回true,checkLoginExistDao类向前端返回JSON 字符串(方法为JSON. toString()或者‘{flag:-1}’),否则返回false。(10分)。 2)请根据以上的信息描述,配置servlet,并给出浏览器正确访问该Servlet的地址(10分)。注I:假定该Servlet所属的web 应用的名称为CS,部署tomcat服务器所在机器的IP 地址为 221.11.83.66, tomcat的端口号为8089。 package com. servlet; public class registerServlet extends HttpServlet_{ public void doGet(HttpServletRequest request,HttpServletResponse response){ response. setContentType("text/html;chareset=UTF-8"); PrintWriter out=response. getWriter();       }} web. xml部分: <web-app> <servlet> <servlet-name>          </servlet-name> <servlet-class>         </servlet-class> </servlet> <servlet-mapping> <servlet-name>     </servlet-name> </url-pattern>       <url-pattern> </servlet-mapping> </web-app> 访问该Servlet的地址为:
05-24

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值