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>   口算加法 - 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="提交">   <span id="msg" style="color:red; font-size:small;">${ msg }</span> </form>     <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); } }
jsp_口算加法 - Image
最新推荐文章于 2022-08-01 12:22:17 发布