2

ページへのリクエストをインターセプト フィルタでフィルタリングする必要があります。さまざまな条件に基づいて、リクエストをさまざまなページにリダイレクトする必要があります。

ここからヒントを得て、バンドルを作成し、サーブレットとフィルターをバンドル アクティベーターに登録しました。

以下はコード スニペットです。

Hashtable initParams = new Hashtable(); // to  pass a dictionary object to
                                        // service.register
initParams.put("sling.servlet.resourceTypes","/login");
initParams.put("sling.servlet.extensions","jsp");
service.registerServlet("/myServlet", this.myServlet, initParams, null);
initParams = new Hashtable();
initParams.put("sling.filter.scope","REQUEST");
service.registerFilter(this.checkPageRequest, "/.*",null, 2, null);
service.registerFilter(this.checkValidSession, "/.*", null, 1, null);

私は2つの問題に直面しています:

  1. フィルタを対応するサーブレットにマッピングしている場所を特定できません。私の理解では、checkPageRequestフィルターが呼び出され、その後にcheckValidSession. がないrequestdispatcher.forward(..)場合、myServletサーブレットがヒットします。私の場合、フィルターは を使用して期待どおりに呼び出されてfilterChain.doFilter(..)いますが、サーブレットは呼び出されていません。

  2. 私のフィルターはすべてのページ要求をインターセプトする必要があるrequestdispatcher.forward(..)ため、任意のページに対して a を実行すると、同じフィルターが再度呼び出されてループに陥ります。

これを DayCQ 環境にデプロイする OSGi バンドルとして開発しています。

4

2 に答える 2

2

Sling を使用しているので、Sling の標準の SCR ベースのメソッドを使用してコンポーネントを登録する必要があります。これについては、http://sling.apache.org/site/filters.htmlでフィルターとhttp://sling.apacheを参照してください。サーブレットの.org/site/servlets.html

あなたがやっているように、サーブレットとフィルターを HttpService に直接登録すると、SlingMainServlet と「戦い」、Sling アプリケーションですべてのリクエストを取得する必要があります。

于 2012-04-13T12:11:58.607 に答える
1

Filter と Servlet は同じ URL マッピングを持つ必要があります。もちろん、フィルターが最初に呼び出されます。

フィルタでデータを前処理し、サーブレットでリクエスト オブジェクトにデータを追加して JSP にディスパッチします。以下の例を参照してください。

@SlingFilter(order=1)

@Properties({
    @Property(name="service.pid", value="com.videojet.hiresite.filters.AddNewUserFilter",propertyPrivate=false),
    @Property(name="service.description",value="Preproceesing Filter", propertyPrivate=false),
    @Property(name="service.vendor",value="XXX Tech", propertyPrivate=false),
    @Property(name="pattern",value="/services/videojet/v1/.*", propertyPrivate=false) 
//  The Property Above property Maps your Filter to URL
})
public class AddNewUserFilter implements javax.servlet.Filter{

    private final Logger log = LoggerFactory.getLogger(this.getClass());
    public void destroy() {
        // TODO Auto-generated method stub

    }

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

        log.info("AddNewUserFilter Invoked Invoked");
// Preprocessing here and just call chain.doFilter(xxx);

そしてサーブレット

@SlingServlet(
        paths={"/services/videojet/v1/AddNewUserController/view","/services/videojet/v1/AddNewUserController/userExists"
                ,"/services/videojet/v1/AddNewUserController/addUser"}
)
@Properties({
    @Property(name="service.pid", value="com.videojet.hiresite.controllers.AddNewUserController",propertyPrivate=false),
    @Property(name="service.description",value="Adds new user", propertyPrivate=false),
    @Property(name="service.vendor",value="XXX Tech", propertyPrivate=false)
})
public class AddNewUserController extends SlingAllMethodsServlet{

    /**
     * @author Oliver Kaunds
     */
    ///content/dam/videojetdocuments
    private static final long serialVersionUID = 1L;

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    @Reference
    protected AddNewUserService addNewUserService;

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {


        log.info(":: Do GET Called ");
        String path =request.getRequestURI();
        log.info("PATH :: "+ path);
        try{
            if(path.equals("/services/videojet/v1/AddNewUserController/view"))
            {
                /* Do the dispatching here  One Servlet can have more than one Request 
                 Mappings . My Each mapping serves a purpose. */

                List<HRRepresentative> list =addNewUserService.getHRRepresentative();
                request.setAttribute("hrList",list );
                HttpSession session = request.getSession();
                String userOperation =(String)session.getAttribute("userOp");
                request.setAttribute("userOp", userOperation);
                session.removeAttribute("userOp");
                //throw new Exception("My Exception");
                RequestDispatcher dispatcher =request.getRequestDispatcher("/content/videojet/en/addnewuser.html"); // Dispatch to JSP here
                dispatcher.forward(request, response); 
            }

これは試行済みのコードです

于 2014-07-08T06:27:37.987 に答える