Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Sling中映射过滤器和servlet_Java_Servlets_Osgi_Servlet Filters_Sling - Fatal编程技术网

Java 在Sling中映射过滤器和servlet

Java 在Sling中映射过滤器和servlet,java,servlets,osgi,servlet-filters,sling,Java,Servlets,Osgi,Servlet Filters,Sling,我有一个要求,我对页面的请求将被拦截过滤器过滤。根据不同的条件,请求必须重定向到不同的页面 我已经创建了一个bundle,并在bundle激活器中注册了servlet和过滤器,从中得到了提示 以下是代码片段: Hashtable initParams = new Hashtable(); // to pass a dictionary object to // service.register initParams

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

我已经创建了一个bundle,并在bundle激活器中注册了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);
我面临两个问题:

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

  • 因为我的过滤器必须截获所有页面请求,所以当我对任何页面执行
    requestdispatcher.forward(..)
    时,会再次调用同一个过滤器,进入循环


  • 我将此作为OSGi捆绑包开发,以部署在DayCQ环境中。

    当您使用Sling时,您应该使用Sling基于SCR的标准方法来注册组件,如过滤器和servlet中所述


    直接向HttpService注册Servlet和筛选器(正如您所做的那样)将与SlingMainServlet“斗争”,SlingMainServlet应该在Sling应用程序中获取所有请求。

    您的筛选器和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); 
                }
    
    @SlingServlet(
    路径={/services/videojet/v1/AddNewUserController/view“,“/services/videojet/v1/AddNewUserController/userExists”
    ,“/services/videojet/v1/AddNewUserController/addUser”}
    )
    @性质({
    @属性(name=“service.pid”,value=“com.videojet.hiresite.controllers.AddNewUserController”,propertyPrivate=false),
    @属性(name=“service.description”,value=“添加新用户”,propertyPrivate=false),
    @属性(name=“service.vendor”,value=“XXX Tech”,propertyPrivate=false)
    })
    公共类AddNewUserController扩展SlingAllMethodsServlet{
    /**
    *@作者奥利弗·考恩斯
    */
    ///内容/大坝/视频文件
    私有静态最终长serialVersionUID=1L;
    私有最终记录器log=LoggerFactory.getLogger(this.getClass());
    @参考文献
    受保护的AddNewUserService AddNewUserService;
    @凌驾
    受保护的void doGet(SlingHttpServletRequest请求、SlingHttpServletResponse响应)抛出ServletException、IOException
    {
    log.info(“::Do GET call”);
    字符串路径=request.getRequestURI();
    log.info(“路径::”+PATH);
    试一试{
    if(path.equals(“/services/videojet/v1/AddNewUserController/view”))
    {
    /*在这里调度一个Servlet是否可以有多个请求
    映射。我的每个映射都有一个目的*/
    List List=addNewUserService.getHRRepresentative();
    setAttribute(“hrList”,list);
    HttpSession session=request.getSession();
    字符串userOperation=(字符串)session.getAttribute(“userOp”);
    setAttribute(“userOp”,userOperation);
    session.removeAttribute(“userOp”);
    //抛出新异常(“我的异常”);
    RequestDispatcher=request.getRequestDispatcher(“/content/videojet/en/addnewuser.html”);//在此处分派到JSP
    转发(请求、响应);
    }
    
    这是一个经过测试的代码