登录界面:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> <!-- web3:项目名,在LoginServlet前必须加项目名,如果不加则默认视为工作空间地址 --> <form action="/web3/LoginServlet" method="post"> username:<input type="text" name="username" /> <br><br> password:<input type="password" name="password" /><br><br> 验证码:<img alt="验证码" src="/web3/RandomImageServlet"><br><br> <input type="submit" value="login"> <br> </form> </body> </html>
Servlet:
public class RandomImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("image/jpeg"); // 禁止浏览器缓存图片 // 3种禁止缓存的头字段 resp.setHeader("expires", "-1"); resp.setHeader("cache-control", "no-cache"); resp.setHeader("pragma", "no-cache"); BufferedImage im = new BufferedImage(80, 40, BufferedImage.TYPE_INT_RGB); Graphics g = im.getGraphics(); g.setColor(Color.WHITE);// 设置颜色 g.fillRect(0, 0, 80, 40);// 填充颜色 g.setColor(Color.BLACK); g.setFont(new Font("TimesRoman", Font.PLAIN, 20)); String str = generateString(); g.drawString(str, 15, 15); // g.drawLine(10, 1, 80, 40); paint(g); ImageIO.write(im, "jpg", resp.getOutputStream()); } // 设置线宽 public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; Stroke st = g2d.getStroke(); Stroke bs; // LINE_TYPE_DASHED bs = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[] { 16, 4 }, 0); g2d.setStroke(bs); g2d.drawLine(10, 1, 80, 40); g2d.setStroke(st); } private String generateString() { String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWZXY0123456789"; int length = s.length(); Random ran = new Random(); StringBuilder sb = new StringBuilder(); sb.append(s.charAt(ran.nextInt(length))); sb.append(s.charAt(ran.nextInt(length))); sb.append(s.charAt(ran.nextInt(length))); sb.append(s.charAt(ran.nextInt(length))); sb.append(s.charAt(ran.nextInt(length))); return sb.toString(); } }