1. 程式人生 > >javaWeb專案用過濾器filter實現登陸成功後才能訪問主頁面,否則直接輸入主頁面的地址自動跳轉到登陸介面

javaWeb專案用過濾器filter實現登陸成功後才能訪問主頁面,否則直接輸入主頁面的地址自動跳轉到登陸介面

想用Filter實現一個登陸驗證的功能,實現登陸成功後才能訪問主頁面,否則直接輸入主頁面的地址會自動跳轉到登陸介面

  • 原理很簡單,每次登陸成功後,建立一個session域物件,將登陸成功的使用者名稱儲存在session中,過濾器要做的就是在每一次跳轉到jsp頁面的請求時會進行過濾(因此在web.xml中要寫 <url-pattern>*.jsp</url-pattern>),然後過濾器會對要跳轉網頁的地址進行分析,如果不是login.jsp(登入頁面)頁面的話就判斷session中有沒有值,如果有值,說明使用者已經登陸,如果為null說明使用者沒登陸,然後將地址重定向到login.jsp(登入頁面)頁面,大致就這樣。
    當然,這只是簡單的實現這個功能而已,其實也可以擴充套件的,利用監聽器,寫一個當前線上的所有使用者,儲存在ServletContext域中的list集合中,同樣也存一個int型別,用於記錄訪問量,同時,也可以實現保證使用者單進單出(不能同時登陸,退出時從線上使用者中移除),這些更能也不難,有時間的話我在寫一寫。

程式碼中很多地方用的System在控制檯輸出的,並沒有提示到頁面(因為太懶)

如果你細心的話,你會發現在get和post方法中我並沒有對中文亂碼進行處理,因為我直接寫了一個過濾器。
這篇文章我會講到用過濾器進行中文亂碼及敏感詞彙的處理,點這裡!!!!

下面是部分程式碼:

UserServlet程式碼如下:

package com.gpf.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.gpf.model.User; import com.gpf.service.UserService; import com.gpf.serviceImpl.UserServiceImpl; /** * @author 朝九晚十 * */ public class UserServlet extends HttpServlet
{
private static final long serialVersionUID = 1L; UserService service = new UserServiceImpl(); User user = null; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String type = request.getParameter("type"); //退出系統 if("exit".equals(type)){ HttpSession session = request.getSession(false); String sessionUser = (String) session.getAttribute("user"); if(sessionUser!=null){ session.removeAttribute("user"); System.out.println("退出成功!"); }else{ System.out.println("退出失敗,使用者已經退出登入!"); } request.getRequestDispatcher("index.jsp").forward(request, response); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String type = request.getParameter("type"); //登陸驗證 if("login".equals(type)){ String userName = request.getParameter("userName"); String userPwd = request.getParameter("userPwd"); user = service.login(userName); if(user!=null){ if(user.getUserPwd().equals(userPwd)){ HttpSession session = request.getSession(); session.setAttribute("user", userName); request.getRequestDispatcher("index.jsp").forward(request, response); }else{ System.out.println("密碼部不正確!"); request.setAttribute("userName", userName); request.setAttribute("message", "輸入密碼錯誤!請重新輸入!"); request.getRequestDispatcher("login.jsp").forward(request, response); } }else{ System.out.println("使用者名稱不存在!"); } } } }

過濾器程式碼如下:

package com.gpf.util;

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 朝九晚十
 *
 */
public class AuthFilter implements Filter {

    /**
     * 銷燬
     */
    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //獲取根目錄所對應的絕對路徑
        String currentURL = request.getRequestURI();
        //擷取到當前檔名用於比較
        String targetURL = currentURL.substring(currentURL.indexOf("/",1),currentURL.length());
        //System.out.println(targetURL);
        //如果session不為空就返回該session,如果為空就返回null
        HttpSession session = request.getSession(false);
        if(!"/login.jsp".equals(targetURL)){
            //判斷當前頁面是否是重頂次昂後的登陸頁面頁面,如果是就不做session的判斷,防止死迴圈
            if(session==null||session.getAttribute("user")==null){
                //如果session為空表示使用者沒有登陸就重定向到login.jsp頁面
                //System.out.println("request.getContextPath()=" + request.getContextPath());  
                response.sendRedirect(request.getContextPath()+"/login.jsp");
                return;
            }
        }

        //繼續向下執行
        chain.doFilter(request, response);
    }

    /**
     * 初始化
     */
    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }

}

在web.xml中新增如下程式碼:

<filter>
    <filter-name>AuthFilter</filter-name>
    <filter-class>com.gpf.util.AuthFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>