1 Reply Latest reply on Jul 21, 2008 9:47 PM by accountclosed

    Captcha Not Updating Without New Session

    accountclosed

      I am using Seam 2.0.2 SP1, Tomcat 6, Ubuntu 7.10 and am trying to use the Seam captcha within a natural conversation. Problem is the captcha does not reload in the following conditions:
      - Invalid input
      - New natural conversation started


      Only if I clear the browser's cache will the captcha reload with a different image/value which indicates that the session has been cleared from the browser. Anyone know how I can make this work properly (i.e., reload an image for each invalid response and new conversation)?


      My form has:



      <rich:panel style="width:250px;">
           <f:facet name="header">
                <h:outputText value="Answer the following question to continue:"></h:outputText>
           </f:facet>
           <h:panelGrid columns="2">
                <h:outputText value="Captcha:"/>
                <h:graphicImage value="/seam/resource/captcha"/>
                <h:outputText value="Result: "/>
                <h:inputText id="verifyCaptcha" value="#{captcha.response}" required="true" 
                     styleClass="text">
                     <s:validate />
                </h:inputText>
                &#160;&#160;<h:message for="verifyCaptcha" styleClass="text"/>
                <h:outputText value="Click: "/>
                <h:commandButton value="REGISTER" action="#{memberreg.start}" styleClass="submit">
                     <s:conversationName value="regmem"/>
                     <s:conversationPropagation type="join"/>
                </h:commandButton>
           </h:panelGrid>
      </rich:panel>
      



      My pages.xml file has:



      <pages xmlns="http://jboss.com/products/seam/pages"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.0.xsd"
      
             no-conversation-view-id="/index.xhtml"
                       login-view-id="/index.xhtml">
        <!-- Couple of notes about the attributes in the root element pages:
      
      <conversation name="regmem"
           parameter-name="memberID"
           parameter-value="#{memberreg.newMember.memberID}"/>
      
      <page view-id="/register.xhtml">
           <param name="memberID" value="#{memberreg.newMember.memberID}"/>
           <navigation from-action="#{memberreg.start}">
                <begin-conversation join="true" conversation="regmem"/>
                <rule if="#{memberreg.started}">
                     <redirect view-id="/register1.xhtml"/>
                </rule>
           </navigation>
           <navigation>
                <rule if="#{memberreg.agree}">
                     <redirect view-id="/register2.xhtml"/>
                </rule>
                <rule if="#{memberreg.started and not memberreg.agree}">
                     <redirect view-id="/register1.xhtml"/>
                </rule>
                <rule if="#{identity.loggedIn}">
                     <redirect view-id="/memberadmin.xhtml"/>
                </rule>
           </navigation>
      </page>
      
      <page view-id="/register1.xhtml" conversation-required="true"
           conversation="regmem">
           <restrict>#{memberreg.started}</restrict>
           <navigation from-action="#{memberreg.agreeToLicense}">
                <rule if="#{memberreg.agree}">
                     <redirect view-id="/register2.xhtml"/>
                </rule>
           </navigation>
           <navigation from-action="#{memberreg.cancel}">
                <rule if="#{not memberreg.agree}">
                     <redirect view-id="/index.xhtml"/>
                     <end-conversation/>
                </rule> 
           </navigation>
           <navigation>
                <rule if="#{identity.loggedIn}">
                     <redirect view-id="/memberadmin.xhtml"/>
                </rule>
           </navigation>
      </page>
      
      <page view-id="/register2.xhtml" conversation-required="true"
           conversation="regmem">
           <restrict>#{memberreg.agree}</restrict>
           <navigation from-action="#{memberreg.end}">
                <rule if="#{memberreg.ended}">
                     <redirect view-id="/index.xhtml"/>
                     <end-conversation/>
                </rule>
           </navigation>
           <navigation>
                <rule if="#{identity.loggedIn}">
                     <redirect view-id="/memberadmin.xhtml"/>
                </rule>
           </navigation>
      </page>
      
      <exception class="org.jboss.seam.security.NotLoggedInException">
      <end-conversation/>
           <redirect view-id="/index.xhtml">
                <message severity="warn">You are not logged in.</message>
           </redirect>
      </exception>
      
      <exception class="org.jboss.seam.security.AuthorizationException">
           <end-conversation/>
           <redirect view-id="/index.xhtml">
                <message severity="warn">You are not authorized.</message>
           </redirect>
      </exception>
      
      </pages>






        • 1. Re: Captcha Not Updating Without New Session
          accountclosed

          Sheesh ... I seem to always find the answer right after I post in here ... :/


          Anyways, for anyone that comes across this as well, it's more of a Javascript issue. Just put this in the top of your XHTML facelets page:



          <script type="text/javascript">
          //<![CDATA[
          function clearCaptchaField() {
          
            document.getElementById("captchaform:verifyCaptcha").value = "";
          }
          window.onload = clearCaptchaField;
          //]]>
          </script>



          And make sure your input has the same id:



          <h:inputText id="verifyCaptcha" value="#{captcha.response}" required="true" styleClass="text" onfocus="">



          This forces the page to reload and therefore set up a new temporary conversation which forces the Seam captcha resource to render a new image.


          Hopefully this answer will help convince the mods not to smack my knuckles. :)