воскресенье, 8 февраля 2015 г.

Использование Captcha в Oracle ADF

При разработке ADF проектов часто может возникнуть  необходимость  создать регистрацию пользователей. И что бы обезопасить  эту часть проекта от ботов, используют Капчу. Капча - компьютерный тест, используемый для того, чтобы определить, кем является пользователь системы: человеком или компьютером. В этой статье я хочу показать как встроить ее  в ADF проект (исходных код приложения можно скачать на github: https://github.com/JealousyM/captcha-adf ).

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. Готово.Можно запускать : )