【问题标题】:NullPointerException into a servlet-filterNullPointerException 进入 servlet 过滤器
【发布时间】:2012-04-05 08:54:21
【问题描述】:

好吧,在我的老问题之后:

Are there some issue at inserting some check into template?

Is it a good idea to filter inside a JSF template?

我正在编写过滤器,但有时(甚至不是在同一点)应用程序在这一行返回 NulPointerException



        chain.doFilter(req, res);

我不明白为什么... 我的过滤器的完整代码是:



    @WebFilter(filterName = "RolesFilter", urlPatterns = {"/*"},
     initParams = {
      @WebInitParam(name = "param", value = "value")})

    public class RolesFilter implements Filter {

        @Override
        public void init(FilterConfig config) throws ServletException {
            // NOOP.
        }

        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            HttpSession session = request.getSession(false);
            UserBean user = (session.getAttribute("userBean") != null) ? (UserBean) session.getAttribute("userBean") : null;
                String uri=request.getRequestURI();

    if(!uri.endsWith("index.xhtml") && !uri.endsWith(".css") && !uri.endsWith(".js")  && !uri.endsWith("template.xhtml"))
    {
            if (user == null || user.getCognome() == null) 
                response.sendRedirect("/cdg/faces/index.xhtml");
            else {
                String app=uri.substring(0,uri.lastIndexOf("/"));
                app=app.substring(app.lastIndexOf("/")+1,app.length());
                HashMap> privilegi= (HashMap)user.getPrivilegi();
                Long idAppl=((AbstractController)session.getAttribute(app+"Controller")).getIdApplicazione();
                Short[] privPoss=((AbstractController)session.getAttribute(app+"Controller")).getPrivilegiPossibili();
    //--- if privPoss has only 3 value the application is a classic application with 2 roles so I can use a generic check, if the number is different I must do a specific check.
                            if(privilegi.get(idAppl)!=null && privPoss.length==3)
                            {
         if((privilegi.get(idAppl)).get(privPoss[0])==null && (uri.endsWith("Edit.xhtml") || uri.endsWith("Create.xhtml")))
                response.sendRedirect("/cdg/faces/index.xhtml");
            } else {
                                if(idAppl==35)
                                {
                                    ProgettiController pc=(session.getAttribute("progettiController")!=null) ? (ProgettiController)session.getAttribute("progettiController") : null;
         if(privilegi.get(idAppl).get(privPoss[1])==null && uri.endsWith("progetti/Create.xhtml"))
                response.sendRedirect("/cdg/faces/index.xhtml"); 
         else if(uri.endsWith("progetti/Edit.xhtml")
     && (!privilegi.get(idAppl).get(privPoss[5]).equals("0") && !UserBean.isInString(pc.getSelected().getIdAzienda().getId()+"",privilegi.get(idAppl).get(privPoss[5]),"#")))
                response.sendRedirect("/cdg/faces/index.xhtml"); 
         else if((uri.endsWith("attivita/Create.xhtml") || uri.endsWith("attivita/Create.xhtml"))
     &&(!pc.getSelected().getIdResponsabile().equals(user.getUtente())) )
                response.sendRedirect"/cdg/faces/index.xhtml"); 
         else if(uri.endsWith("attivita/Edit.xhtml")
     && (!privilegi.get(idAppl).get(privPoss[2]).equals("0") && !UserBean.isInString(pc.getSelected().getIdAzienda().getId()+"",privilegi.get(idAppl).get(privPoss[2]),"#")))
                response.sendRedirect("/cdg/faces/index.xhtml"); 
         else if((uri.endsWith("progettiQualifica/Create.xhtml") || uri.endsWith("progettiQualifica/Create.xhtml"))
     && (!pc.getSelected().getIdResponsabile().equals(user.getUtente())))
                response.sendRedirect("/cdg/faces/index.xhtml"); 
         else if((uri.endsWith("progettiSchede/Create.xhtml") || uri.endsWith("attivita/Create.xhtml"))
     && (!pc.getSelected().getIdResponsabile().equals(user.getUtente())))
                response.sendRedirect("/cdg/faces/index.xhtml"); 
    }
                                else if(idAppl==2)
                                {
                                    RisorseController rc=(session.getAttribute("risorseController")!=null) ? (RisorseController)session.getAttribute("risorseController") : null;
         if(privilegi.get(idAppl).get(privPoss[0])==null && (uri.endsWith("Create.xhtml") || uri.endsWith("Edit.xhtml")))
                response.sendRedirect("/cdg/faces/index.xhtml"); 
         else if(uri.endsWith("Edit.xhtml")
     && (!rc.getSelected().equals(user.getUtente())))
                response.sendRedirect("/cdg/faces/index.xhtml"); 
                                }
                                }
                            }
        } 
                chain.doFilter(req, res);

    }

        @Override
        public void destroy() {
            // NOOP.
        }

    }

问题可能出在哪里?

好吧,在这个答案之前,我从我的代码中删除了一行,现在过滤器似乎工作正常,这行会导致问题吗?



    System.out.println("The uri is:"+request.getRequestURI());

它是在 doFilter 方法中的第一个 if 之后... 感谢您的帮助!

【问题讨论】:

    标签: java nullpointerexception servlet-filters


    【解决方案1】:

    您可能正在调用doFilter(ServletRequest, ServletResponse, FilterChain) 方法并将null 值作为第三个参数。

    你检查了吗?

    【讨论】:

    • 它不会改变问题。
    • 如果他传入null,它会给NullPointerException 相当一致,不是吗?
    • @KARASZI István : emh...抱歉,我不明白你的问题,或者更好的是,如果没有我的特定调用,过滤器不会自动从应用程序调用吗?如果正确,不带参数怎么调用?
    • 不是没有参数,而是有null值的参数。
    • @KARASZI István :好的,但我的问题仍然没有答案......如果我从不直接调用它,我如何将参数设置为不为空? :)
    猜你喜欢
    • 2014-10-26
    • 2013-11-11
    • 2012-06-24
    • 2012-02-17
    • 2011-02-26
    • 2013-04-09
    • 2014-04-07
    • 2014-02-12
    • 2010-12-30
    相关资源
    最近更新 更多