jsp_口算加法 - Image

 

CalculateImage.java 


package com;

import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
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 com.sun.net.httpserver.HttpsServer;

@WebServlet("/CalculateImage")
public class CalculateImage extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8"); // 设置请求内容的编码
		response.setContentType("text/html;charset=UTF-8"); // 设置输出的文档类型和字符编码
		// java.io.PrintWriter out = response.getWriter(); //获取输出句柄
		String msg = ""; // 初始化,用于保存提示信息

		String answer = request.getParameter("answer"); // 获取输入的答案

		for (int f = 0; f < 1; f++) {

			HttpSession session = request.getSession(); // 获取或创建session
			Integer number1 = Integer.parseInt(session.getAttribute("number1").toString()); // 从session获取值并转换成Integer类型
			Integer number2 = Integer.parseInt(session.getAttribute("number2").toString()); // 强制转换会报错

			if (number1 == null || number2 == null || answer == null) { // 未生成随机数或无输入
				randomNumberToSession(request); // ****生成2个随机数并存入session
				break;
			}

			Integer answerInt = 0;
			answerInt = Integer.parseInt(answer);

			if (number1 + number2 != answerInt) {
				msg = "计算错误,你上一次的输入是:" + number1 + "+" + number2 + "=" + answer;
				break;
			}

			msg = "恭喜,计算正确!请进行新一轮的计算。";
			randomNumberToSession(request); // *******重新生成2个随机数并存入session
		}

		request.setAttribute("msg", msg); // 在request中给消息msg赋值
		request.getRequestDispatcher("calculateImage.jsp").forward(request, response); // 转发给网页calculateByServlet.jsp
		return;
	}

	// ----------生成2个随机数并存入session
	public void randomNumberToSession(HttpServletRequest request) {
		HttpSession session = request.getSession();				//获取或创建session
		Random random = new Random();				//创建随机对象
		
		int number1 = random.nextInt(51);				//生成0~50的随机数字1
		int number2 = random.nextInt(51);				//生成0~50的随机数字2
		session.setAttribute("number1",  number1);		//在session中给number1赋值
		session.setAttribute("number2", number2);		//在session中给number2赋值
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

calculateImage.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
  <head>
	<title>口算加法 - Image</title>
  </head>

  <body>
	<div style="width:600px; margin:20px auto; line-height:40px;">
    	<h3>&emsp;&emsp; 口算加法 - Image</h3>
		<form action="CalculateImage" method="post">
		   	<img src="VerifyCode" style="vertical-align: middle;">
		   	+
		   	<img src="VerifyCode2" style="vertical-align: middle;">
			=
			<input type="text" name="answer"  style="width:50px;">
			<input type="submit" value="提交">
			&emsp;
	    	<span id="msg" style="color:red; font-size:small;">${ msg }</span>
		</form>
		&emsp;&emsp;&emsp;&emsp;<a href="calculateImage.jsp">首页</a>
	</div>
  </body>
</html>

VerifyCode.java

package com;

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.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;

@WebServlet("/VerifyCode")
public class VerifyCode extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("image/gif");					//返回图片文件
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		
		ServletOutputStream out = response.getOutputStream();	//输出流
		
		Font mFont = new Font("Times New Roman", Font.PLAIN, 18); 	//设置字体
		int width = 40, height = 20;						//设置图片大小
		
		
		BufferedImage image = new BufferedImage(width, height,	//图像缓冲对象
				BufferedImage.TYPE_INT_RGB); 
		Graphics gra = image.getGraphics();
		
		Random random = new Random(); 							//设置随机对象

		gra.setColor(getRandColor(200, 250)); 					//设置背景色
		gra.fillRect(0, 0, width, height); 						//填充长方形
		gra.setColor(Color.black); 								//设置字体色
		gra.setFont(mFont); 		
		gra.setColor(getRandColor(160, 200)); 					//设置线条颜色
		
		for (int i = 0; i < 100; i++) {							//随机产生100条干扰线,使图象中的验证码不易被其它程序探测到
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			gra.drawLine(x, y, x + xl, y + yl); 				//画线
		}
		
		String number1 = "";										//验证码内容
		
		for (int i = 0; i < 1; i++) {						//随机产生一个的数字
			String rand = String.valueOf(random.nextInt(51)); 	//0~50的随机数字
			number1 += rand;
			
			gra.setColor(new Color(20 + random.nextInt(110), 
					20 + random.nextInt(110), 20 + random.nextInt(110))); 	//设置颜色
			gra.drawString(rand, 13 * i + 6, 16);				//将验证码合成到图像中
		}
		
		gra.setColor(getRandColor(160, 200)); 					//设置线条颜色
		
		for (int i = 0; i < 20; i++) {							//再随机产生20条干扰线,使图象中的验证码不易被其它程序探测到
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			gra.drawLine(x, y, x + xl, y + yl); 				//画线
		}
		
		HttpSession session = request.getSession(true);	 		//等同于request.getSession();将创建一个新的session。若为false则是尝试读取session
		session.setAttribute("number1", number1); 	//####修改代码	//验证码内容保存到 session
		session.setMaxInactiveInterval(20); 					//多少秒后该session过期
		
		ImageIO.write(image, "gif", out);						//将图像缓冲对象写入到图像实体
		out.close();
	}

	static 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);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

VerifyCode2.java

package com;

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.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;

@WebServlet("/VerifyCode2")
public class VerifyCode2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("image/gif");					//返回图片文件
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		
		ServletOutputStream out = response.getOutputStream();	//输出流
		
		Font mFont = new Font("Times New Roman", Font.PLAIN, 18); 	//设置字体
		int width = 40, height = 20;	//####修改代码:使宽度变小	//设置图片大小
		
		
		BufferedImage image = new BufferedImage(width, height,	//图像缓冲对象
				BufferedImage.TYPE_INT_RGB); 
		Graphics gra = image.getGraphics();
		
		Random random = new Random(); 							//设置随机对象

		gra.setColor(getRandColor(200, 250)); 					//设置背景色
		gra.fillRect(0, 0, width, height); 						//填充长方形
		gra.setColor(Color.black); 								//设置字体色
		gra.setFont(mFont); 		
		gra.setColor(getRandColor(160, 200)); 					//设置线条颜色
		
		for (int i = 0; i < 100; i++) {							//随机产生100条干扰线,使图象中的验证码不易被其它程序探测到
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			gra.drawLine(x, y, x + xl, y + yl); 				//画线
		}
		
		String number2 = "";										//验证码内容
		
		for (int i = 0; i < 1; i++) {						//随机产生一个的数字
			String rand = String.valueOf(random.nextInt(51)); 	//0~50的随机数字
			number2 += rand;
			
			gra.setColor(new Color(20 + random.nextInt(110), 
					20 + random.nextInt(110), 20 + random.nextInt(110))); 	//设置颜色
			gra.drawString(rand, 13 * i + 6, 16);				//将验证码合成到图像中
		}
		
		gra.setColor(getRandColor(160, 200)); 					//设置线条颜色
		
		for (int i = 0; i < 20; i++) {							//再随机产生20条干扰线,使图象中的验证码不易被其它程序探测到
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			gra.drawLine(x, y, x + xl, y + yl); 				//画线
		}
		
		HttpSession session = request.getSession(true);	 		//等同于request.getSession();将创建一个新的session。若为false则是尝试读取session
		session.setAttribute("number2", number2); 					//验证码内容保存到 session
		session.setMaxInactiveInterval(20); 					//多少秒后该session过期
		
		ImageIO.write(image, "gif", out);						//将图像缓冲对象写入到图像实体
		out.close();
	}

	static 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);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值