3

アクションへのリクエストは、インターセプターを使用して検証できます。また、空のアクション宣言を使用して、JSP ページへの直接要求を回避できます。このようなものです。

<action name="home" >
        <result>home.jsp</result>
</action>  

この JSP ページへの呼び出しを検証したいと考えています。簡単なアプローチは、アクション名をチェックするアクション(ActionSupport)を追加することInterceptorです(セッションなどを使用していくつかの検証を行います)。しかし、そのアクションクラスは何もせず、その唯一の(役に立たないタスク...)を実行するだけであり、空の Actionexecute()があるはずなので、パフォーマンスが低下するかどうかは疑問です。 Struts2 のドキュメントを読んでみると、Action 呼び出しを追加しなくても、フレームワーク自体が "success" を返すアクション クラスを追加するため、アクション クラスを追加しても、自分で追加しても、新たに影響しないと言われています)。

とにかく、いくつかのJSPページへのアクセスを検証または承認するための最善のアプローチは何かを知りたいです(ページ数は多くてもかまいません.. 1つのjspページだけではありません)

追加: 例:
すべてのユーザーがアクセスできない制限されたページがいくつかあるとしましょう。たとえば、ユーザーのアカウント ページは、ログインしているユーザーのみがアクセスできます。そのようなタイプのページがさらに存在する可能性があります。リクエストがそのようなページに来た場合、ユーザーを検証する必要があります。次に、リクエストが空の/匿名のアクション (上記のコード スニップで説明されているように - アクション名のみ - 実際のクラスなし) を介して送信された場合、そのようなリクエストを検証する方法JSPページ?これにはアクションクラスを使用する必要がありますか?

4

2 に答える 2

1

//これは承認用です

package com.kogent.action;

import java.io.IOException;
import java.util.List;
import java.util.regex.Pattern;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.dispatcher.ng.ExecuteOperations;
import org.apache.struts2.dispatcher.ng.InitOperations;
import org.apache.struts2.dispatcher.ng.PrepareOperations;
import org.apache.struts2.dispatcher.ng.filter.FilterHostConfig;
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;

public class SessionController extends StrutsPrepareAndExecuteFilter {
    protected PrepareOperations prepare;
    protected ExecuteOperations execute;
    protected List<Pattern> excludedPatterns = null;

public void init(FilterConfig filterConfig) throws ServletException {
    InitOperations init = new InitOperations();
    try {
        FilterHostConfig config = new FilterHostConfig(filterConfig);
        init.initLogging(config);
        Dispatcher dispatcher = init.initDispatcher(config);
        init.initStaticContentLoader(config, dispatcher);

        prepare = new PrepareOperations(filterConfig.getServletContext(),
                dispatcher);
        execute = new ExecuteOperations(filterConfig.getServletContext(),
                dispatcher);
        this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);

        postInit(dispatcher, filterConfig);
    } finally {
        init.cleanup();
    }

}

/**
 * Callback for post initialization
 */
protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) {
}

public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    try {
        prepare.setEncodingAndLocale(request, response);
        prepare.createActionContext(request, response);
        prepare.assignDispatcherToThread();
        if (excludedPatterns != null
                && prepare.isUrlExcluded(request, excludedPatterns)) {
            chain.doFilter(request, response);
        } else {
            request = prepare.wrapRequest(request);
            ActionMapping mapping = prepare.findActionMapping(request,
                    response, true);
            if (mapping == null) {
                boolean handled = execute.executeStaticResourceRequest(
                        request, response);
                if (!handled) {
                    chain.doFilter(request, response);
                }
            } else {
                //here you have to identify the whether the user have access to requested resource or not 
                //allow him if he was access.
                //if(someCondition)
                execute.executeAction(request, response, mapping);
                //else{
                //redirect the user how do you want it to be.
                ActionMapping modfiedActionMapping = new ActionMapping();
                modfiedActionMapping.setName("someActionName");
                modfiedActionMapping.setNamespace("someNameSpace");
                execute.executeAction(request, response, modfiedActionMapping);

            //}

            }
        }
    } finally {
        prepare.cleanupRequest(request);
    }
}

public void destroy() {
    prepare.cleanupDispatcher();
}

}

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>Point to your customized filter</filter-class>
</filter>
于 2012-06-24T08:06:52.080 に答える
1

アプリケーションの一部を保護して、認証済みおよび承認済みの使用のみがその部分にアクセスできるようにすることに注意を払う場合、2 つのオプションがあります。

  1. インターセプターベースの認証を使用する
  2. Spring のようなセキュリティ API を使用する -security

インターセプターベースの認証は非常に簡単です。これを行う方法の例を次に示しますが、このような認証は、実際には非常に単純なケースであるため、実稼働ベースの実際のアプリケーションにはお勧めできません。

完全な認証システムを探している場合は、Spring セキュリティを検討することをお勧めします。非常に簡単で構成可能です。すべての領域と安全なタグと Spring セキュリティの下で、アクションの前にそれらをインターセプトする基礎となるスプリング メカニズムを伝える必要があります。呼び出され、成功した承認アクションのみが春のセキュリティによって呼び出されます。

于 2012-06-24T07:43:35.213 に答える