Фильтр сервлетов дает исключение NullPointerException

1

Я создал веб-приложение java и использовал фильтр для предотвращения несанкционированного доступа, но он не работает. После успешного входа в систему он должен идти home.jsp, но не собирается. когда я запускаю приложение, он запускает выполнение из метода init в AuthFilter.java, а после метода init управление переходит к предопределенному методу Method.java netbeans. В браузере отображается следующая ошибка:

HTTP Status 500 -
type Exception report
message
description The server encountered an internal error that prevented it from fulfilling this request.
exception
java.lang.NullPointerException
    Filters.AuthFilter.doFilter(AuthFilter.java:47)

note Полная трассировка стека основной причины доступна в журналах Apache Tomcat/8.0.3. Вот код.

LoginServlet.java

package Servlets;

//all important files are imported

public class LoginServlet extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String user = "king";
        String pass  = "king";

        String uname = request.getParameter("user");
        String upass = request.getParameter("pwd");

        if(uname.equals(user) && upass.equals(pass))
        {
            HttpSession session = request.getSession(true);
            session.setAttribute("username", uname);
//            Cookie userName = new Cookie("user", user);
//            userName.setMaxAge(10*60);
//            response.addCookie(userName);
            response.sendRedirect("home.jsp");
        }
        else
        {
            RequestDispatcher rd = getServletContext().getRequestDispatcher("index.jsp");
            PrintWriter out = response.getWriter();
            out.println("<font color=red>Either user name or password is wrong.</font>");
            rd.include(request, response);
        }
    }



}

AuthFilter.java

package Filters;

public class AuthFilter implements Filter {

    ArrayList<String> array = new ArrayList<>();
    private ServletContext context;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {
        System.out.println("2");
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        String uri = req.getRequestURI();

        HttpSession session = req.getSession(false);
        boolean r = false;
        if(array.contains(uri))
        {
            r = true;
        }
        System.out.println(" r result my = " + r);
        Object o = session.getAttribute("username");
        System.out.println("abcde = " + o);
        if(o == null)
            System.out.println("null session my = " + session);
        else
            System.out.println(" not null session my = " + session);
//        System.out.println("session getAttribute = " + session.getAttribute("username"));
        if(o == null && r == true)
        {
            System.out.println("unauthorized");
            r = false;
            res.sendRedirect("index.jsp");
        }
        else
        {
            System.out.println("auth");
            chain.doFilter(request, response);
        }

    }

    @Override
    public void destroy() {
        System.out.println("3");
    }

    @Override
    public void init(FilterConfig filterConfig) {
        System.out.println("1");
        this.context = filterConfig.getServletContext();
        array.add("/MyFilter/demo.jsp");
        array.add("/MyFilter/more.jsp");
        array.add("/MyFilter/home.jsp");
        System.out.println("show array list:-\n");
        for (String array1 : array) {
            System.out.print(array1 + "\n");
        }
        this.context.log("AuthenticationFilter initialized");
    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <filter>
        <filter-name>AuthFilter</filter-name>
        <filter-class>Filters.AuthFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AuthFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>Servlets.LoginServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>Servlets.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/LogoutServlet</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>
  • 0
    в браузере произошла следующая ошибка: HTTP Status 500 - тип Описание сообщения отчета об исключении Сервер обнаружил внутреннюю ошибку, которая не позволила ему выполнить этот запрос. исключение java.lang.NullPointerException Filters.AuthFilter.doFilter (AuthFilter.java:47) note Примечание Полная трассировка стека основной причины доступна в журналах Apache Tomcat / 8.0.3.
  • 1
    Здорово. Пожалуйста, отметьте строку 47 в AuthFilter .
Показать ещё 1 комментарий
Теги:
nullpointerexception
servlet-filters

2 ответа

1

В вашем сервлете вы пытаетесь получить доступ к текущему сеансу с request.getSession(false). Это не создает какой-либо сеанс, поэтому при первом доступе вы получаете только null том, что сеанс не инициализирован. Но вы не тестируете его и сразу используете, чтобы ошибка. Вместо этого вы должны использовать request.getSession(true) чтобы гарантировать, что сеанс будет создан, если он не существует, при правильном использовании существующего.

  • 0
    Да уж! он работает сейчас, но если я напишу этот request.getSession (false), то он тоже работает сейчас ... почему ???
  • 0
    Tomcat может сохранять сеансы при остановке веб-приложения и восстанавливать их при следующем запуске.
0

Можете ли вы проверить, является ли сеанс нулевым или нет после

HttpSession session = req.getSession(false);

предоставление false не приведет к созданию нового сеанса, и, следовательно, результат может быть нулевым. Это приведет к исключению нулевого указателя следующей строкой

Object o = session.getAttribute("username");
  • 0
    сеанс не является нулевым, и значение: org.apache.catalina.session.StandardSessionFacade@1bdd51d

Ещё вопросы

Сообщество Overcoder
Наверх
Меню