在B/S結構專案中,為防止別心用心的使用者嘗試登入通常採用生成校驗碼圖片的方式進行控制,圖片中的數字是隨機生成的。以下程式碼是具體實現方法:
圖片生成實用類:
- import java.awt.*;
- import java.awt.image.*;
- import java.util.*;
-
- public class ImageCode {
-
- public String sRand = "";
-
- public 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);
- }
-
- public BufferedImage creatImage() {
-
- int width = 60, height = 20;
- BufferedImage image = new BufferedImage(width, height,
- BufferedImage.TYPE_INT_RGB);
-
- Graphics g = image.getGraphics();
-
- Random random = new Random();
-
- g.setColor(getRandColor(200, 250));
- g.fillRect(0, 0, width, height);
-
- g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
-
-
- g.setColor(getRandColor(160, 200));
- for (int i = 0; i < 155; i++) {
- int x = random.nextInt(width);
- int y = random.nextInt(height);
- int xl = random.nextInt(12);
- int yl = random.nextInt(12);
- g.drawLine(x, y, x + xl, y + yl);
- }
-
- for (int i = 0; i < 4; i++) {
- String rand = String.valueOf(random.nextInt(10));
- sRand += rand;
-
- g.setColor(new Color(20 + random.nextInt(110), 20 + random
- .nextInt(110), 20 + random.nextInt(110)));
- g.drawString(rand, 13 * i + 6, 16);
- }
-
- g.dispose();
- return image;
- }
-
-
-
-
- public String getSRand() {
- return sRand;
- }
- }
生成圖片的servlet:
- import java.awt.image.BufferedImage;
- import java.io.IOException;
-
- import javax.imageio.ImageIO;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
-
-
-
-
-
-
- public class RandomImgCodeServlet extends HttpServlet {
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- response.setContentType("image/jpeg");
- ImageCode image = new ImageCode();
- response.setHeader("Pragma", "No-cache");
- response.setHeader("Cache-Control", "no-cache");
- response.setDateHeader("Expires", 0);
- try {
-
- BufferedImage img = image.creatImage();
- request.getSession().setAttribute("rand", image.getSRand());
-
- ImageIO.write(img, "JPEG", response.getOutputStream());
- response.getOutputStream().flush();
- response.getOutputStream().close();
- } catch (Exception e) {
- System.out.println("錯誤:" + e);
- }
- }
-
- }
記得在web.xml中對上面這個servlet進行配置,我的配置是:
xml 程式碼
- <servlet>
- <servlet-name>RandomImgCodeServletservlet-name>
- <servlet-class>org.lixy.util.RandomImgCodeServletservlet-class>
- <servlet>
- <servlet-mapping>
- <servlet-name>RandomImgCodeServletservlet-name>
- <url-pattern>/servlet/randomImgCodeServleturl-pattern>
- <servlet-mapping>
在需要放置此圖片的地方加入如下程式碼:
html程式碼
- <img src="/servlet/randomImgCodeServlet" class="imageRandom" height="18px"/>
大功告成了。。。呵呵,簡單吧
|