2014-09-02 3 views
1

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

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) 

примечания Полной трассировки стеки первопричины доступно в журналах 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 \t Filters.AuthFilter.doFilter (AuthFilter.java:47) примечание Полный трассировки стека первопричины доступна в журналах Apache Tomcat/8.0.3. – King

+1

Прохладный. Пожалуйста, отметьте строку 47 в 'AuthFilter'. – AlexR

+0

Согласовано - добавьте номера строк в свой код, или мы просто угадаем, где ошибка – Stewart

ответ

0

Вы можете проверить если сеанс равен нулю или нет после

HttpSession session = req.getSession(false); 

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

Object o = session.getAttribute("username"); 
+0

. Сессия не равна нулю, а значение: [email protected] – King

0

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

+0

Да! теперь он работает, но если я напишу этот request.getSession (false), тогда он также будет работать сейчас ... почему ??? – King

+0

Tomcat может сохранять сеансы при остановке веб-приложения и восстанавливать их при следующем запуске. –