0

我正在使用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在一Windows 7 64bit台机器上使用Java 1.7.0_07.

问题

为什么重新加载后才显示图像?有任何想法吗?

4

4 回答 4

2

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

1> 修改 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 {    

    }    

}    
于 2014-02-17T19:18:17.837 回答
0

检查web.xmlhascaptcha.png而 theHTML指的是captcha.jpg

这能解决问题吗?

于 2013-01-23T13:06:45.680 回答
0

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

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

你明白这个解释吗?对你有帮助吗?

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

您可以添加到将实现HttpSessionListener. 然后,在方法中,sessionCreated您可以StickyCaptchaServlet使用刚刚创建的添加请求sessionId。根据StickyCaptchaServlet文档,您只需doGet使用传递的 sessionId 键调用它的方法。之后 - 当您页面上的浏览器请求 url时,它应该作为响应图像在您的实现/services/captcha.png之前创建和准备。HttpSessionListener

另一种方法是使用客户端脚本,在页面加载后,根本没有图像,只需重新加载它 - 作为这种内部重新加载,例如 JavaScript,浏览器将知道 sessionId 并将其传递给验证码图像的请求。重新加载是指仅重新加载图像,而不是整个页面。

这些建议中的任何一个都能解决您的问题吗?给我一个反馈。

于 2013-01-23T13:35:46.600 回答
0

只需这样做即可绕过 emka86 所说的话。

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

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

希望这对任何未来的开发人员都有帮助。

于 2014-03-09T14:03:07.010 回答