【问题标题】:mapping filters and servlet in SlingSling 中的映射过滤器和 servlet
【发布时间】:2012-04-24 12:35:41
【问题描述】:

我有一个要求,我对页面的请求将通过拦截过滤器进行过滤。根据不同的条件,需要将请求重定向到不同的页面。

我已经创建了一个包,并在包激活器中注册了 servlet 和过滤器,并从 here 获得了提示。

下面是sn-p的代码:

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

我面临两个问题:

  1. 我无法确定将过滤器映射到相应 servlet 的位置。我的理解是checkPageRequest 过滤器将被调用,然后是checkValidSession。如果没有requestdispatcher.forward(..),则myServlet servlet 将被命中。在我的例子中,过滤器被使用filterChain.doFilter(..)按预期调用,但servlet没有被调用。

  2. 由于我的过滤器必须拦截所有页面请求,所以当我对任何页面执行requestdispatcher.forward(..) 时,会再次调用相同的过滤器,进入循环。

我正在将其开发为 OSGi 捆绑包,以部署在 DayCQ 环境中。

【问题讨论】:

    标签: java servlets osgi servlet-filters sling


    【解决方案1】:

    在使用 Sling 时,您应该使用 Sling 的标准基于 SCR 的方法来注册您的组件,在 http://sling.apache.org/site/filters.html 中描述了过滤器,http://sling.apache.org/site/servlets.html 中描述了 servlet。

    像您似乎正在做的那样直接向 HttpService 注册 servlet 和过滤器将与 SlingMainServlet“对抗”,后者应该在 Sling 应用程序中获取所有请求。

    【讨论】:

      【解决方案2】:

      那么您的过滤器和 Servlet 应该具有相同的 URL 映射。当然,过滤器会首先被调用。

      让Filter对数据进行预处理,让servlet将数据添加到request对象中并分派给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);
      

      还有 Servlet

      @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); 
                  }
      

      这是一个久经考验的代码

      【讨论】:

        猜你喜欢
        • 2011-04-10
        • 2013-10-05
        • 1970-01-01
        • 2011-06-29
        • 2015-04-27
        • 2012-01-03
        • 2023-03-17
        • 2012-02-19
        • 2020-04-11
        相关资源
        最近更新 更多