javaWeb專案用過濾器filter實現登陸成功後才能訪問主頁面,否則直接輸入主頁面的地址自動跳轉到登陸介面
阿新 • • 發佈:2019-01-25
想用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>