在JSF 2.0页面中集成Captcha的问题

时间:2011-03-07 09:57:22

标签: java jsf java-ee jsf-2 captcha

我正在按照我在本页http://javahunter.wordpress.com/2010/09/25/integrating-captcha-in-jsf-2-0/中找到的教程,将验证码集成到我在JSF 2.0中制作的用户注册表单中,但我遇到了一些问题,也许有人可以帮助我。这就是我到目前为止所做的:

JSF页面:

<h:graphicImage id="capimg" value="#{facesContext.externalContext.requestContextPath}/../Captcha.jpg"/>
    <h:inputText id="captchaUserInput" value="#{registrationController.captchaUserInput}"/>
<br />
    <h:commandButton value="Register"
        action="#{registrationController.doRegisterBuyer}">
    </h:commandButton>

Managed bean:

@ManagedBean
@RequestScoped
public class RegistrationController {
...
private String captchaUserInput;
...

public String doRegisterBuyer() throws Exception {
...<code for setting the values of the user>
HttpServletRequest request = (HttpServletRequest) FacesContext
            .getCurrentInstance().getExternalContext().getRequest();
    Boolean isResponseCorrect = Boolean.FALSE;
    javax.servlet.http.HttpSession session = request.getSession();
    String parm = captchaUserInput;
    String c = (String) session.getAttribute(MyCaptcha.CAPTCHA_KEY);
    if (parm.equals(c)) {

        buyersRegistratorEJB.createBuyer(buyer);

    } else {

        return "failed";
    }

    return "registrationSucceded.xhtml";
}

类MyCaptcha.java(源代码可以在上面的链接中找到)是一个servlet,我添加到我项目中名为other的包中

web.xml配置:

    <servlet>
    <servlet-name>Captcha</servlet-name>
    <servlet-class>other.MyCaptcha</servlet-class>
    <init-param>
        <description>passing height</description>
        <param-name>height</param-name>
        <param-value>30</param-value>
    </init-param>
    <init-param>
        <description>passing height</description>
        <param-name>width</param-name>
        <param-value>120</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>Captcha</servlet-name>
    <url-pattern>/Captcha.jpg</url-pattern>
</servlet-mapping>

我认为这是问题的一部分,因为当我导航到我的注册页面时,我在控制台中看到了这一点:

WARNING: StandardWrapperValve[Captcha]: PWC1382: Allocate exception for servlet Captcha
java.lang.ClassNotFoundException: other.MyCaptcha

我认为我无法正确实现此原因的原因之一是因为web.xml中MyCaptcha.java的路径不正确。我怎么能解决这个问题?另外我想提一下,我不想添加更改图像选项,只有图像对我来说很好。

2 个答案:

答案 0 :(得分:1)

类路径中缺少servlet。根据这条评论

  

它位于我的项目C:\ jee6workspace \ BBS \ src \ other \ MyCaptcha.java

您似乎正在使用IDE。重建项目,将项目重新发布到服务器,重新启动服务器。还要检查服务器部署文件夹,确保servlet已编译并显示为BBS/WEB-INF/classes/other/MyCaptcha.class文件。

如果是,并且您仍然遇到此问题,那么servlet的构造/初始化失败(它引发了未捕获的异常)。阅读服务器日志以获取详细信息并相应地修复根本原因。

答案 1 :(得分:0)

也许您可以尝试使用包含验证码组件的Primefaces jsf组件库。它很容易使用(只需放入你的页面)。

www.primefaces.org