0

SimpleCaptchaを使用して、お問い合わせフォームを保護しています。うまく機能しますが、ページをリロードした後でのみです

サーブレットは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を搭載したWindows 7 64bitマシンで使用していJava 1.7.0_07ます。

質問

リロード後にのみ画像が表示されるのはなぜですか? 何か案は?

4

4 に答える 4

2

従うことができるいくつかの手順があります。

1> web.xml を変更し、nl.captcha.servlet.StickyCaptchaServlet クラスを拡張するサーブレットを追加します

 <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>

2> CustomCaptchaServlet.java

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 {    

    }    

}    
于 2014-02-17T19:18:17.837 に答える
0

が を参照しているときにが をweb.xml持っていることを確認します。captcha.pngHTMLcaptcha.jpg

それで問題は解決しますか?

于 2013-01-23T13:06:45.680 に答える
0

問題は、StickyCaptchaServlet がセッション用の新しいキャプチャ イメージを作成していることです。ページに最初のリクエストを行うとき、セッション ID がないため、StickyCaptchaServlet は特定のセッション用に作成された画像に接続できません。

最初にメイン サーブレットにセッションを作成してもらい、ある種のsessionId. 次のリクエスト (リロードも) で、以前に受信したリクエストをサーバーに送信するsessionIdためStickyCaptchaServlet、セッションにいることがわかっているため、セッションのキャプチャ画像を収集できるようになりました。

この説明わかりますか?お役に立ちますか?

この問題を解決するために質問の後に追加しました。

を実装する Web アプリ クラスに追加できますHttpSessionListener。次に、メソッドで、作成したばかりのsessionCreatedにリクエストを追加できます。ドキュメントによると、渡された sessionId キーを使用してメソッドを呼び出すだけです。その後 - ページのブラウザが URL を要求すると、実装によってその直前に作成および準備された応答画像として取得する必要があります。StickyCaptchaServletsessionIdStickyCaptchaServletdoGet/services/captcha.pngHttpSessionListener

もう 1 つの方法は、クライアント側のスクリプトを使用することです。ページがロードされた後、画像がまったくない状態でページをリロードするだけです。たとえば、JavaScript などのこの内部リロードにより、ブラウザは sessionId を認識し、キャプチャ イメージのリクエストを介してそれを渡します。リロードとは、ページ全体ではなく、画像のみをリロードすることを意味します。

これらの提案のいずれかが問題を解決しますか? それについてフィードバックをください。

于 2013-01-23T13:35:46.600 に答える