天天看點

過濾器_登入權限的判斷

登陸權限判斷

登陸, 送出到登陸Servlet處理其業務!

登陸成功, 跳轉到首頁,顯示歡迎資訊 + 清單資訊

登陸失敗,跳轉到登陸!

要求:

隻有登陸後,才可以通路首頁, 顯示清單

如果沒有登陸,直接通路首頁清單,要跳轉到登陸!

實作思路:

1.Login.jsp   登陸頁面

2.List.jsp     清單顯示

3.LoginServlet.java   登陸處理servlet

4.ListServlet.java   首頁清單查詢Servlet

5.LoginFilter.java     登陸驗證過濾器

能直接通路的連結有:

​​

     http://localhost:8080/contactSystem/login.jsp

​​

​​

     http://localhost:8080/contactSystem/LoginServlet

​​

 不能直接通路的連結有:

​​

     http://localhost:8080/contactSystem/ListServlet

​​

​​http://localhost:8080/contactSystem/list.jsp​

核心過濾器代碼:

但是此過濾器有問題:

①頁面用了js和css,也會被攔截,是以通過截取uri來判斷這樣不妥。

②但登入成功後再直接通路list.jsp,能進入,而且是空資料。

是以此代碼僅供過濾器寫法作參考。

package com.cn.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * 登入驗證過濾器
 * @author liuzhiyong
 
 能直接通路的連結有:
   http://localhost:8080/contactSystem/login.jsp
   http://localhost:8080/contactSystem/LoginServlet
 不能直接通路的連結有:
   http://localhost:8080/contactSystem/ListServlet
   http://localhost:8080/contactSystem/list.jsp
 */
public class LoginFilter implements Filter{
  /**
   * 攔截業務邏輯:
   * 1.先指定放行的資源,哪些資源不需要攔截:
   *    login.jsp + /LoginServlet  (request對象可以擷取)
   * 2.擷取session,從session中擷取使用者資訊userInfo
   * 3.再判斷使用者資訊是否為空
   *    為空,說明沒有登入,跳轉到登入
   *    不為空,已經登入,放行
   */
  @Override
  public void doFilter(ServletRequest req, ServletResponse res,
      FilterChain chain) throws IOException, ServletException {
    
    //轉型
    HttpServletRequest request = (HttpServletRequest)req;
    HttpServletResponse response = (HttpServletResponse)res;
    
    //擷取到請求的uri
    String uri = request.getRequestURI();
    System.out.println("=======攔截的uri=========="+uri);
    //先判斷指定放行的資源,給予放行:
    if(uri.equals(request.getContextPath()+"/LoginServlet") || uri.equals(request.getContextPath()+"/login.jsp")
        || uri.equals(request.getContextPath()+"/css/login.css") || uri.equals(request.getContextPath()+"/js/login.js")
        || uri.equals(request.getContextPath()+"/js/jquery-1.8.2.js")){
      //放行
      chain.doFilter(request, response);
    }else{//攔截其它資源
      //擷取session,從session中擷取使用者資訊userInfo
      HttpSession session = request.getSession(false);//注意這裡填上參數false,以免自己建立
      if(session != null){
        //從session中擷取使用者資訊userInfo
        Object userInfo = session.getAttribute("userInfo");
        //判斷使用者資訊是否為空
        if(userInfo == null){//沒有登入,跳轉到登入
          request.getRequestDispatcher("/login.jsp").forward(request, response);
        }else{//已經登入,放行
          chain.doFilter(request, response);
        }
      }else{//session為空,說明也沒有登入,跳到登入
        request.getRequestDispatcher("/login.jsp").forward(request, response);
      }
    }
  }
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub
    
  }
  
  @Override
  public void destroy() {
    // TODO Auto-generated method stub
    
  }
}