【问题标题】:Path to background in servletservlet 中的背景路径
【发布时间】:2012-11-18 02:56:20
【问题描述】:

//下面的行是我的 HTML 表单的元素,它呈现由下面进一步编写的 servlet 发送的图像。

  <img style="margin-left:91px; margin-top:-6px;" class="image" src="http://www.abcd.com/captchaServlet"> 

我在 java 中使用以下代码生成验证码。

public class captchaServlet extends HttpServlet {


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

    int width = 150;
    int height = 50;
    int charsToPrint = 6;

     String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXYabcdefhjkmnpqrstuvwxy1234567890";

     char[] chars = elegibleChars.toCharArray();
StringBuffer finalString = new StringBuffer();

   for ( int i = 0; i < charsToPrint; i++ ) {
     double randomValue = Math.random();
     int randomIndex = (int) Math.round(randomValue * (chars.length - 1));
     char characterToShow = chars[randomIndex];
     finalString.append(characterToShow);
   }
   System.out.println(finalString);

    BufferedImage bufferedImage = new BufferedImage(width, height, 
                  BufferedImage.TYPE_INT_RGB);

    Graphics2D g2d = bufferedImage.createGraphics();

    Font font = new Font("Georgia", Font.BOLD, 18);
    g2d.setFont(font);

    RenderingHints rh = new RenderingHints(
           RenderingHints.KEY_ANTIALIASING,
           RenderingHints.VALUE_ANTIALIAS_ON);

    rh.put(RenderingHints.KEY_RENDERING, 
           RenderingHints.VALUE_RENDER_QUALITY);

    g2d.setRenderingHints(rh);

    GradientPaint gp = new GradientPaint(0, 0, 
    Color.BLUE, 0, height/2, Color.black, true);

    g2d.setPaint(gp);
    g2d.fillRect(0, 0, width, height);

    g2d.setColor(new Color(255, 255, 0));

    Random r = new Random();
    int index = Math.abs(r.nextInt()) % 5;
    char[] data=new String(finalString).toCharArray();
    String captcha = String.copyValueOf(data);
    int x = 0; 
    int y = 0;

    for (int i=0; i<data.length; i++) {
        x += 10 + (Math.abs(r.nextInt()) % 15);
        y = 20 + Math.abs(r.nextInt()) % 20;
        g2d.drawChars(data, i, 1, x, y);
    }

    g2d.dispose();

    response.setContentType("image/png");
    OutputStream os = response.getOutputStream();
    ImageIO.write(bufferedImage, "png", os);
    os.close();
  } 


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


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

但在上面的代码背景中,我猜也是使用 setPaint 方法生成的。我希望背景是来自我的本地机器的一些图像,我应该能够提到它的 URL

URL url=this.getClass().getResource("Desktop/images.jpg");
BufferedImage bufferedImage = ImageIO.read(url);

我写上面两行只是为了让读者更好地理解问题所在。不想使用完全相同的命令。我想要的只是生成的验证码的背景应该是我选择的图像。

【问题讨论】:

  • 为了尽快获得更好的帮助,到目前为止,请发布您的代码的SSCCE。热链接到 BG 图像(例如来自 here)或在代码中生成一个。
  • @AndrewThompson 您好,我已经上传了一个正在运行的代码以及一张显示验证码现在是如何生成的图像。所以你看到图片中的蓝色和黑色背景,我想用我自己的图片替换它。
  • 对于 servlet,更多地关注ServletContext.getResourceAsStream(String)
  • 使用ImageIO.read(InputStream)加载图片的InputStream
  • @AndrewThompson 即使我把它作为输入流我如何把它作为我的验证码的背景。

标签: java servlets captcha bufferedimage graphics2d


【解决方案1】:

而不是调用

g2d.setPaint(gp);
g2d.fillRect(0, 0, width, height);

你可能需要这样调用:

g2d.drawImage(bufferedImage, 0, 0, null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2020-05-15
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    相关资源
    最近更新 更多