2

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

我创建了一个包并在包激活器中注册了 servlet 和过滤器,从这里得到了提示。

以下是代码片段:

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(..),则myServletservlet 将被命中。在我的情况下,过滤器按预期通过 using 被调用filterChain.doFilter(..),但 servlet 没有被调用。

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

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

4

2 回答 2

2

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

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

于 2012-04-13T12:11:58.607 回答
1

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

让 Filter 预处理数据,让 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); 
            }

这是一个久经考验的代码

于 2014-07-08T06:27:37.987 回答