1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
| import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; 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 CaptchaServlet extends HttpServlet { private static final long serialVersionUID = 5581444867349884055L; private static final Random random = new Random();
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String type = request.getParameter("type"); if (null == type || "".equals(type)) { return; } if ("genarate".equals(type)) { int width = 100, height = 30; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); OutputStream os = response.getOutputStream(); Graphics g = image.getGraphics(); g.setColor(getRandColor(50, 100)); g.fillRect(0, 0, width, height); g.setFont(new Font("Times New Roman", Font.BOLD, 20)); for (int i = 0; i < 100; i++) { g.setColor(getRandColor(100, 200)); int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(width); int yl = random.nextInt(height); g.drawLine(x, y, x+1, y+1); } g.setColor(getRandColor(100, 250)); g.drawString(createEquation(request), 2, 22); g.dispose(); ImageIO.write(image, "JPEG", os); os.close(); return; } else if ("validate".equals(type)){ String captchaNo = request.getParameter("captchaNo"); if (null == captchaNo || "".equals(captchaNo)) { response.getWriter().print("false"); } if (captchaNo.equals(request.getSession().getAttribute("captchaNo").toString())) { response.getWriter().print("true"); } else { response.getWriter().print("false"); }
return; } }
private Color getRandColor(int fc, int bc) { 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); }
private String createEquation(HttpServletRequest request) { char[] arr = {'+', '-'}; int num1 = random.nextInt(30); int operate = random.nextInt(2); int num2 = random.nextInt(30); if (num1 < num2) { int temp = num1; num1 = num2; num2 = temp; } int captchaNo = 0; switch (operate) { case 0: captchaNo = num1 + num2; break; case 1: captchaNo = num1 - num2; break; } HttpSession session = request.getSession(); session.setAttribute("captchaNo", captchaNo); return num1+" "+ arr[operate]+" "+num2+" = ?"; } }
|