我正在使用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
。
问题
为什么图像仅在重新加载后显示?有什么想法吗?
答案 0 :(得分:1)
您可以遵循以下几个步骤:
<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>
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
中,您可以使用刚刚创建的StickyCaptchaServlet
向sessionId
添加请求。根据{{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)
希望这有助于任何未来的开发人员。