При разработке ADF проектов часто может возникнуть  необходимость  создать регистрацию пользователей. И что бы обезопасить  эту часть проекта от ботов, используют Капчу. Капча - компьютерный тест, используемый для того, чтобы определить, кем является пользователь системы: человеком или компьютером. В этой статье я хочу показать как встроить ее  в ADF проект (исходных код приложения можно скачать на github: https://github.com/JealousyM/captcha-adf ).
1. Создайте Fusion ADF приложение. В нем создайте jspx страницу со следующими компонентами:
2. Создайте ManagedBean, например с именем captchaBean
3. Скачайте jar с сайта http://simplecaptcha.sourceforge.net
4. Добавьте его в проект
5. Добавьте следующий код в web.xml( при помощи этого кода вы добавите сервлет скачанный ранее)
6. Создайте биндинги для inlineFrame, panelGroupLayout и inputText (первые два для обновления страницы с кода, а к inputtext для извлечения введенных данных. Так же создайте методы для кнопок.
7. Добавьте код в бине для проверки введенных данных и обновления картинки:
8. Готово.Можно запускать : )
1. Создайте Fusion ADF приложение. В нем создайте jspx страницу со следующими компонентами:
- inlineFrame - компонент для отображения капчи
- 2 commandToolbarButton. Первая для обновления капчи, если она не разборчива.Вторая для обработки введенных данных.
- inputText - компонент для ввода данных которые вы увидели в капче.
- group layout - компонент для группировки элементов страницы.
2. Создайте ManagedBean, например с именем captchaBean
3. Скачайте jar с сайта http://simplecaptcha.sourceforge.net
4. Добавьте его в проект
5. Добавьте следующий код в web.xml( при помощи этого кода вы добавите сервлет скачанный ранее)
<servlet>
 <servlet-name>CaptchaServlet</servlet-name>
 <servlet-class>nl.captcha.servlet.SimpleCaptchaServlet</servlet-class>
 <init-param>
 <param-name>width</param-name>
 <param-value>250</param-value>
 </init-param>
 <init-param>
 <param-name>height</param-name>
 <param-value>75</param-value>
 </init-param>
</servlet>
<servlet-mapping>
 <servlet-name>CaptchaServlet</servlet-name>
 <url-pattern>/captchaservlet</url-pattern>
</servlet-mapping>
6. Создайте биндинги для inlineFrame, panelGroupLayout и inputText (первые два для обновления страницы с кода, а к inputtext для извлечения введенных данных. Так же создайте методы для кнопок.
<af:panelGroupLayout id="pgl1" layout="vertical" halign="center"
                             binding="#{captchaBean.pgl}" valign="top">
          <af:inlineFrame id="if1" source="/captchaservlet"
                          binding="#{captchaBean.iframe}"
                          clientComponent="true"
                          inlineStyle="height:90px; width:230.0px;"/>
          <af:commandButton text="Не вижу Captch-у" id="cb1"
                            partialSubmit="true" immediate="true"
                            actionListener="#{captchaBean.refresh}"/>
          <af:inputText id="it1" binding="#{captchaBean.inputText}"/>
          <af:commandButton text="Проверить" id="cb2"
                            actionListener="#{captchaBean.checkAnswer}"
                            partialSubmit="true"/>
        </af:panelGroupLayout>
7. Добавьте код в бине для проверки введенных данных и обновления картинки:
    public void checkAnswer(ActionEvent actionEvent) {
        FacesContext fctx = FacesContext.getCurrentInstance();
         ExternalContext ectx = fctx.getExternalContext();
         HttpServletRequest request =
         (HttpServletRequest) ectx.getRequest();
         Captcha captcha = (Captcha) ectx.getSessionMap().get(Captcha.NAME);
         try {
         request.setCharacterEncoding("UTF-8");
         } catch (UnsupportedEncodingException e) {
         System.out.println("UTF не поддерживается !");
         }
         String answer = (String)inputText.getValue();
         if (answer != null && captcha.isCorrect(answer)){
             fctx.addMessage(null,new
             FacesMessage(FacesMessage.SEVERITY_INFO,"Введена правильная Captcha. Урааа!!",null));
         }
         else{
        fctx.addMessage(null,new
        FacesMessage(FacesMessage.SEVERITY_INFO,"Ошибка.Всмотритесь внимательней в Captch-у",null));
         AdfFacesContext.getCurrentInstance().addPartialTarget(pgl);
         }
  
    }
    public void refresh(ActionEvent actionEvent) {
        AdfFacesContext.getCurrentInstance().addPartialTarget(iframe);
    }
8. Готово.Можно запускать : )




 
Комментариев нет:
Отправить комментарий