【问题标题】:Servlet return null stream for CaptchaServlet 为验证码返回空流
【发布时间】:2016-05-25 21:05:40
【问题描述】:

我有一个 servlet 可以在我的 jsp 页面上生成验证码,但是很多时候我从这个 servlet 得到 null 并且得到无效的验证码错误,我尝试了很多但仍然不知道为什么我在这里得到这个是我的验证码 servlet

p>
public class CaptchaServlet extends HttpServlet {


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

    int width = 200;
    int height = 42;

    char data[] = RandomStringUtils.randomNumeric(4).toLowerCase().toCharArray();


    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,new Color(144, 46, 54), 0, height/2, new Color(144, 46, 54), true);

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

    g2d.setColor(Color.white);

    Random r = new Random();

    String captcha = String.copyValueOf(data);
    System.out.println("In captcha Servlet :-  "+captcha);
    request.getSession().setAttribute("captcha", captcha );

    int x = 0;
    int y = 0;

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

    g2d.dispose();

    response.setContentType("image/png");
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage, "png", os);
    byte[] bytes = os.toByteArray();
    ServletOutputStream out = response.getOutputStream();
    out.write(bytes);
    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);
  }
}

下面是我的jsp代码

<div id="captcha_div">
<img id="captcha_img" src="<%=appContext%>/CaptchaServlet"
style="float: left; width: 70%; margin-top: 2%;">
<div style="padding-top: 5%; margin-left: 73%">
<button class="refresh" onclick="javascript:regenImage();"type="button">  
</button></div></div>

我检查验证码和用户在另一个 servlet 中输入的代码,例如

            String code = request.getParameter("code");
            String captcha = (String) session.getAttribute("captcha");
            if (captcha != null && code != null) {
                if (captcha.equals(code)) {
                    isValid = true;
                }
            }

我很少得到空值,我重现的一种情况是,当登录页面保持理想状态 10,20 分钟时,我得到验证码的值为空值,因此我得到无效的验证码错误,你能告诉我为什么我得到null 或者我在代码中做错了什么谢谢...

【问题讨论】:

    标签: java jsp servlets captcha


    【解决方案1】:

    您能否将您的 processRequest 代码放在 try catch 中,并在发出请求时检查日志中打印的以下代码的内容。

    String captcha = String.copyValueOf(data);
    System.out.println("In captcha Servlet :-  "+captcha);
    request.getSession().setAttribute("captcha", captcha );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多