2015-03-02 50 views
0

我有以下過濾器代碼:在NetBeans瞭解Servlet過濾器重定向行爲

@WebFilter(urlPatterns = "/faces/*") 
public class AuthenticationFilter implements Filter { 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 

    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 
    HttpSession session = req.getSession(true); 

    System.out.println("No Filtering"); 
    chain.doFilter(request, response); 

} 

啓動項目將導致印刷「不過濾」的兩倍,作爲一個時間攔截請求,第二將是攔截響應。
到目前爲止很好,但直到現在沒有過濾。使用POST方法更新網頁或提交表單的結果也是一樣的。 現在添加以下過濾條件:

if (!req.getRequestURI().toLowerCase().endsWith("/index.xhtml") 
      &&(session.isNew() || session.getAttribute("username") == null)) { 
     System.out.println("directed"); 
     res.sendRedirect(req.getContextPath() + "/index.xhtml"); 
    }else{ 
    System.out.println("not directed"); 
    chain.doFilter(request, response);} 

將打印「定向」一旦結果符合市場預期。現在,在更新網頁或提交表單時出現問題,即使「無過濾」也不會打印出來?它看起來像過濾器不適用於HTTP請求,我不明白爲什麼?
這是我的web.xml文件:

<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
</context-param> 
<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/faces/*</url-pattern> 
</servlet-mapping> 
<session-config> 
    <session-timeout> 
     30 
    </session-timeout> 
</session-config> 
<welcome-file-list> 
    <welcome-file>faces/index.xhtml</welcome-file> 
</welcome-file-list> 

UPDATE1:
我試圖設置HTTP響應狀態到302303307,但沒有任何變化。

+0

重複的嘗試http://stackoverflow.com/questions/28800688/does-my-filter-run-in-an-infinite-redirect-循環 – BalusC 2015-03-02 12:06:39

+0

沒有什麼有用的提到的鏈接http://stackoverflow.com/questions/28800688/does-my-filter-run-in-an-infinite-redirect-loop – AWT 2015-03-02 12:40:24

+0

此外問題不是很好的結構,我很害怕我誤解了...... – AWT 2015-03-02 12:48:14

回答

0
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
    { 
     HttpServletRequest req = (HttpServletRequest) request; 
     HttpServletResponse res = (HttpServletResponse) response; 
     HttpSession session = req.getSession(true); 
     String requestPath = req.getRequestURI(); 
     PrintWriter out =res.getWriter(); 
     if(session.getAttribute("UserName")==null)// Check for null user 
      { 
      if(needsAuthentication(requestPath)) //If user is on Login.jsp it lets user to stay there 
       { 
       chain.doFilter(req, res); 
       } 
      else 
       {//If user is not on login page with session attribute null it will check if the form has submitted user name and password 
        if((req.getParameter("username"))==null) 
         {//If no user name and password is submitted it means user is trying to access other pages without login so 
         //this condition will land user on login page 
         out.println("Please Login !"); 
         RequestDispatcher rd =req.getRequestDispatcher("Login.jsp"); 
         rd.include(req, res); 
         } 
        else 
          { 
           if ((req.getParameter("username")).equals("admin")&&(req.getParameter("password").equals("123"))) 
            {//If correct credentials are submitted user session is started 
             LoginUser user =new LoginUser(); 
             user.setUserName("admin"); 
             session.setAttribute("UserName", user.getUserName()); 
             session.setMaxInactiveInterval(60); 
             chain.doFilter(req, res); 
            } 
           else 
             {//This will send user to login page again when wrong credentials are set 
             out.print("Incorrect UserName or Password"); 
             RequestDispatcher rd =req.getRequestDispatcher("Login.jsp"); 
             rd.include(req, res); 
             } 
          } 
       }  
      } 
     else//This else part is checked when the user session is not null 
      { 
      if(session.getAttribute("UserName").equals("admin"))//if user is valid it will continue the flow 
       { 
       System.out.println("In Second If"); 
       chain.doFilter(req, res); 
       } 
      else   
       { //if user is invalid will land up on login page 
     System.out.println("In Second Else"); 
     req.getRequestDispatcher("Login.jsp").forward(request, response); 
       } 

      } 
     } 

使用這和她的方法

private boolean needsAuthentication(String requestPath) { 
     { 
       String validNonAuthenticationUrls ="/Login.jsp"; 

        if (requestPath.endsWith(validNonAuthenticationUrls)) { 
         return true; 
        } 
       } 
       return false; 
      } 
     }