0

オークション Web アプリケーション用に 2 つのフィルターを作成しました。2 つのフィルターを実装しました。最初のフィルターは単純なログ操作を実行し、2 番目のフィルターはユーザーが特定のリソースへのアクセスを許可されているかどうかを確認します。

問題は、これらのフィルターが Web サイトに初めて接続したときにのみ正しく機能することです。実際、ツールバーにユーザーの名前が表示されます。これは、正しくログインした場合にのみ発生します。その後、ログアウトしてプロセスを繰り返しますが、2 番目のフィルターはまったく機能しません。

フィルターが実際に実行されるかどうかを確認するために println ステートメントを配置しましたが、そうではありません。最初のフィルターは常に機能します。xml マッピングを変更すると、奇妙な部分が発生します。実際、両方のフィルターのマッピングを削除すると、最初のフィルターが機能し続けます! 私はこれを理解しようとして、昨日一日中夢中になりました。

さらに奇妙なことに、フィルターのxmlマッピングを書き直すと、最初のログインプロセスの両方で機能しますが、ログアウトして操作を繰り返すと、ログインフィルターは機能しなくなります。私の Web アプリケーションを作成するには、JAVA7、netbeans 7.2、および Tomcat 7 だけです。これは Netbeans IDEA のバグではないかと心配していますが、よくわかりません。

xml マッピングは次のとおりです。

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<filter>
    <filter-name>FiltroLoggingFumettopoli</filter-name>
    <filter-class>Filtri.FiltroLoggingFumettopoli</filter-class>
</filter>
<filter-mapping>
    <filter-name>FiltroLoggingFumettopoli</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter>
    <filter-name>FiltroLogin</filter-name>
    <filter-class>Filtri.FiltroLogin</filter-class>
</filter>
<filter-mapping>
    <filter-name>FiltroLogin</filter-name>
    <url-pattern>/Registrato/*</url-pattern>
    <servlet-name>IlMioConto</servlet-name>
    <servlet-name>Vendi</servlet-name>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>**

ログ ファイルにログを記録する最初のフィルターを次に示します。

private void doBeforeProcessing(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {
    if (debug) {
        log("FiltroLoggingFumettopoli:DoBeforeProcessing");
    }


    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;


    this.log(httpRequest.getRemoteHost()+" is trying to access page: "+httpRequest.getRequestURL()+
                " il "+TimeUtility.ottieniDataOra()+". "+filterConfig.getFilterName());
    System.out.println("FILTRO FILE DI LOG----> LOGGING OCCURED IN LOG FILE: "
            +httpRequest.getRequestURL()+" il "+TimeUtility.ottieniDataOra()+". "+filterConfig.getFilterName());
}    

private void doAfterProcessing(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {
    if (debug) {
        log("FiltroLoggingFumettopoli:DoAfterProcessing");
    }
}


public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {

    doBeforeProcessing(request, response);

    Throwable problem = null;
    try {
        chain.doFilter(request, response);
    } catch (Throwable t) {

        problem = t;
        t.printStackTrace();
    }

    doAfterProcessing(request, response);


    if (problem != null) {
        if (problem instanceof ServletException) {
            throw (ServletException) problem;
        }
        if (problem instanceof IOException) {
            throw (IOException) problem;
        }
        sendProcessingError(problem, response);
    }
}

以下は、Registrato フォルダーに含まれるリソースといくつかのサーブレットにアクセスしたいのが許可されたユーザーであるかどうかをチェックするフィルターです。

public class FiltroLogin implements Filter
{    
private FilterConfig filterConfig = null;

public void init(FilterConfig filterConfig)
{
    this.filterConfig = filterConfig;
}

public void doFilter(ServletRequest request,ServletResponse response, 
     FilterChain chain) throws IOException, ServletException
{

    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    HttpSession sessione = httpRequest.getSession();

    ServletContext sc = filterConfig.getServletContext();

    String filterName = filterConfig.getFilterName();
    String servletPath = "Servlet path: " + httpRequest.getServletPath();

    String url ="";

    Utente user = null;
    user = (Utente) sessione.getAttribute("utente");
    if(user == null){

        Cookie[] cookies =httpRequest.getCookies();
        String email = CookieUtility.ottieniValoreCookie(cookies, "userCookie");
        if(email.equalsIgnoreCase("")){               
            System.out.println("FILTRO LOGIN----->NESSUN COOKIE TROVATO!");
            System.out.println("FILTRO LOGIN----->SERVLET CONTEXT: "+sc.getContextPath());


            url ="/MostraInserzioni";
            httpResponse.sendRedirect(sc.getContextPath()+url);
            return;
        }
        else{
            System.out.println("FILTRO LOGIN----->COOKIE TROVATO: "+email); 
            user = UtenteSql.cercaUtente(email);
            System.out.println("FILTRO LOGIN----->UTENTE TROVATO: "+user.getUsername());
            sessione.setAttribute("utente", user);     
            String salutoUtente = "Benvenuto "+user.getNome();
            sessione.setAttribute("messaggio", salutoUtente);

        }
    }
    else
        System.out.println("FILTRO LOGIN----->USER FOUND: "+user.getUsername());


     sc.log(httpRequest.getRemoteHost()+" cerca di accedere alla risorsa: "+httpRequest.getRequestURL()+
                " il "+TimeUtility.ottieniDataOra()+". "+filterConfig.getFilterName());
    System.out.println("FILTRO FILE DI LOG----> LOGGING OCCURED IN LOG FILE: "
            +httpRequest.getRequestURL()+" il "+TimeUtility.ottieniDataOra()+". "+filterConfig.getFilterName());
    chain.doFilter(request, response);

}

public void destroy()
{
     filterConfig = null;
}
}
4

1 に答える 1

1

Simply user = sessione == null ? null : (Utente) sessione.getAttribute("utente");and after else {just:sessione = httpRequest.getSession(true);非ユーザーがセッションを保持するのを防ぎます。– 昨日のJoop Eggen

HttpSession sessione = httpRequest.getSession(false);
if (sessione == null) {
    System.out.println("FILTRO LOGIN----->USER NOT FOUND IN SESSION!");

– Salvatore Servodio 44 分前

次に、Cookie を確認しました。必要な Cookie が見つかった場合は、新しいセッションを作成してユーザー情報をセッションに入れるだけです。それ以外の場合は、単にログイン ページにリダイレクトします。

于 2013-05-23T08:24:49.147 に答える