2012-04-12 91 views
2

我有一个要求,其中我对页面的请求是通过拦截过滤器进行过滤。根据不同的条件,请求必须重定向到不同的页面。映射过滤器和servlet在吊带

我创建了一个包和注册的servlet和过滤器在包激活,采取了线索,从here

以下是代码片段:

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 bundle来部署在DayCQ环境中。

回答

1

嗯,你的过滤器和Servlet应该有相同的URL映射。过滤器会先被调用。

让预处理的数据筛选,并让该servlet在请求对象添加数据,并派遣它的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); 
      } 

这是一个尝试和测试码