2014-09-02 35 views
1

我創建了一個java web應用程序並使用篩選器來防止未經授權的訪問,但它不起作用。成功登錄後,它應該去home.jsp但不去。當我運行應用程序時,它開始執行從初始化方法AuthFilter.java和init方法後控制去Method.java netbeans預定義的方法。 在以下錯誤的瀏覽器被示出:Servlet篩選器提供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

跟隨誤差。 例外 顯示java.lang.NullPointerException \t Filters.AuthFilter.doFilter(AuthFilter.java:47) 音符的根本原因的完整棧跟蹤可用在的Apache Tomcat/8.0.3日誌。 – King 2014-09-02 10:45:09

+1

很酷。請在'AuthFilter'中標記第47行。 – AlexR 2014-09-02 10:47:15

+0

同意 - 爲您的代碼添加行號,或者我們只是猜測錯誤的位置 – Stewart 2014-09-02 10:50:09

回答

0

你可以檢查如果會話爲空或沒有後

HttpSession session = req.getSession(false); 

給虛假不會創建一個新的會話,因此結果可以爲空。這將導致空指針異常以下行

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

會話不爲空,值爲:[email protected] – King 2014-09-02 13:13:20

0

在你的servlet,你試試用request.getSession(false)訪問當前會話。這不會創建任何會話,所以在第一次訪問時,您只會得到一個null,表示沒有會話被初始化。但是你不測試它,並立即使用它,所以錯誤。您應該改用request.getSession(true)以確保在不存在的情況下創建會話,同時正確使用現有的會話。 - 類型異常報告 消息 描述服務器遇到阻止其完成此請求一個內部錯誤HTTP狀態500:在瀏覽器中發生

+0

是啊!它的工作現在,但是,如果我寫這個request.getSession(false),那麼它現在也工作...爲什麼? – King 2014-09-02 13:12:26

+0

當停止Web應用程序並在下次啓動時恢復它們時,Tomcat能夠保存會話。 – 2014-09-02 13:16:17

相關問題