2012-04-12 2 views
2

페이지에 대한 내 요청을 가로 채기 필터로 필터링해야하는 경우가 있습니다. 다른 조건에 따라 요청을 다른 페이지로 리디렉션해야합니다.Sling의 필터 및 서블릿 매핑

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. 내가 서블릿 대응에 필터를 매핑하고 위치를 식별 할 수 아니에요 다음

    코드 조각입니다. 제 생각에 checkPageRequest 필터가 호출되고이어서 checkValidSession이 호출됩니다. requestdispatcher.forward(..)이 없으면 myServlet 서블릿에 충돌합니다. 필자의 경우 필터는 filterChain.doFilter(..)을 사용하여 예상대로 호출되지만 서블릿은 호출되지 않습니다.

  2. 내 필터는 모든 페이지 요청을 차단해야하므로 아무 페이지에서나 requestdispatcher.forward(..)을 수행하면 동일한 필터가 다시 호출되어 루프에 들어갑니다.

DayCQ 환경에 배포 할 OSGi 번들로 개발 중입니다.

답변

1

그럼 필터와 서블릿은 동일한 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); 
      } 

가 시도하는 서블릿과 테스트 코드를 참조