simplecaptcha图像仅在重新加载后提供

时间:2013-01-23 12:51:20

标签: java servlets captcha simplecaptcha

我正在使用SimpleCaptcha来保护我们的联系表单。它运行良好,但只有在重新加载页面后

Servlet为nl.captcha.servlet.StickyCaptchaServlet,因此重新加载后不应更改图像。但是,当第一次打开页面时,图像就没有加载。但是,重新加载后一切正常。

web.xml

验证码由运行在/services的应用程序提供。

<web-app>
  <servlet>
    <servlet-name>captcha</servlet-name>
    <servlet-class>nl.captcha.servlet.StickyCaptchaServlet<servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>captcha</servlet>
    <url-pattern>/captcha.png</url-pattern>
  </servlet-mapping>
</web-app>

html

<img src="/services/captcha.png">

服务器

我在使用tomcat-7.0.34的{​​{1}}计算机上使用Windows 7 64bit

问题

为什么图像仅在重新加载后显示?有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您可以遵循以下几个步骤:

1&GT;修改web.xml添加扩展nl.captcha.servlet.StickyCaptchaServlet类的servlet

 <servlet>   
    <description></description>    
    <display-name>CustomCaptchaServlet</display-name>    
    <servlet-name>CustomCaptchaServlet</servlet-name>    
    <servlet-class>org.example.servlets.CustomCaptchaServlet</servlet-class>    
 </servlet>    
  <servlet-mapping>    
    <servlet-name>CustomCaptchaServlet</servlet-name>    
    <url-pattern>/CustomCaptchaServlet</url-pattern>    
  </servlet-mapping>

2 - ; CustomCaptchaServlet.java

package org.example.servlets;    
import static nl.captcha.Captcha.NAME;    

import java.io.IOException;    

import javax.servlet.ServletException;    
import javax.servlet.http.HttpServlet;    
import javax.servlet.http.HttpServletRequest;    
import javax.servlet.http.HttpServletResponse;    
import javax.servlet.http.HttpSession;    

import nl.captcha.Captcha;    
import nl.captcha.servlet.CaptchaServletUtil;    
import nl.captcha.servlet.StickyCaptchaServlet;    

public class CustomCaptchaServlet extends StickyCaptchaServlet {    
    private static final long serialVersionUID = 1L;    

    /**
     * @see StickyCaptchaServlet#StickyCaptchaServlet()
     */
    public CustomCaptchaServlet() {
        super();
        // TODO Auto-generated constructor stub
    }


    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    

        String _width = getServletConfig().getInitParameter("width");    
        String _height = getServletConfig().getInitParameter("height");    
        HttpSession session = request.getSession();    
        Captcha captcha;    
        if (session.getAttribute(NAME) == null) {    
            captcha = new Captcha.Builder(Integer.parseInt(_width), Integer.parseInt(_height))    
            .addText()    
            .gimp()    
            .addBorder()    
                .addNoise()    
                .addBackground()    
                .build();    
            session.setAttribute(NAME, captcha);    
            CaptchaServletUtil.writeImage(response, captcha.getImage());    
            return;    
        }    
        captcha = (Captcha) session.getAttribute(NAME);    
        CaptchaServletUtil.writeImage(response, captcha.getImage());    
    }    


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

    }    

}    

答案 1 :(得分:0)

web.xml指的是captcha.png时,请检查HTML是否有captcha.jpg

这是否解决了这个问题?

答案 2 :(得分:0)

问题是StickyCaptchaServlet正在为会话创建新的验证码图像。当您对页面发出初始请求时,您没有会话ID,因此StickyCaptchaServlet无法将您连接到为特定会话创建的任何图像。

第一次请求主servlet为您创建会话后,再向您发送某种sessionId。使用下一个请求(也是重新加载),您发送到服务器请求,之前已收到sessionId,所以现在您的StickyCaptchaServlet可以为您的会话收集验证码图像,因为它知道您在任何会话中。

你理解这个解释吗?它对你有帮助吗?

在您的问题后添加以解决此问题。

您可以添加到将实施HttpSessionListener的网络应用类。然后,在方法sessionCreated中,您可以使用刚刚创建的StickyCaptchaServletsessionId添加请求。根据{{​​1}} doc,您只需使用传递的sessionId键调用它的StickyCaptchaServlet方法。在此之后 - 当您网页上的浏览器请求网址doGet时,它应该会在您的/services/captcha.png实施之前创建并准备好响应图像。

其他方式是使用cliend side脚本并在页面加载后,根本没有图像,只需重新加载它 - 因为这个内部重新加载,例如JavaScript,浏览器将知道sessionId并将通过验证码请求传递它图片。通过重新加载我的意思是只重新加载图像,而不是整个页面。

这些建议会解决您的问题吗?给我一个关于它的反馈。

答案 3 :(得分:0)

通过emka86所说的方式,这样做。

<img src="/services/captcha.png" style="display:none"> (Duplicate part to fix the issue)

<img src="/services/captcha.png"> (The actual one)

希望这有助于任何未来的开发人员。