程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Filter二(利用Filter實現簡單的登錄驗證)

Filter二(利用Filter實現簡單的登錄驗證)

編輯:C++入門知識

Filter二(利用Filter實現簡單的登錄驗證)

目標:1.我們規定利用Filter我們實現一個如果在Url中包含有admin的請求的時候,那麼我們就要驗證當前的用戶是否登錄,如果沒有登錄那麼跳轉到登錄的界面

2.當我們登錄成功的時候,我們應該跳回到我們之前請求的頁面。


1.首先創建我們的LoginFilter

public class LoginFilter implements Filter{
	
	private FilterConfig filterConfig ;


	public void destroy() {	
	}


	public void doFilter(ServletRequest serlvetRequest, ServletResponse serlvetResponse,
			FilterChain filterChain) throws IOException, ServletException {
 			HttpServletRequest httpServletRequest = (HttpServletRequest) serlvetRequest ;
 			HttpServletResponse httpServletResponse = (HttpServletResponse)serlvetResponse;
 			HttpSession session = httpServletRequest.getSession();
 			User loginUser	= (User)session.getAttribute(ConfigBean.session_login_user);
 			
 			if(loginUser == null){
 				String url = httpServletResponse.encodeRedirectURL(httpServletRequest.getRequestURL().toString()) ;
   				//throw new NotLoginException(url);
  				httpServletResponse.sendRedirect(ConfigBean.getBasePath()+"error/Login.jsp?returnUrl="+url);
  			}else{
 				filterChain.doFilter(serlvetRequest, serlvetResponse);
 			}
 	}


	public void init(FilterConfig filerConfig) throws ServletException {
 		this.filterConfig = filerConfig ;
	}
}

說明:1 .我們利用session去判斷我們當前的用戶是否是登錄了,如果沒有redirect登錄的界面,同時我們要把我們當前訪問的那個界面的url傳入到登錄的界面,這樣在登錄成功了,我們就可以返回到我們的請求的頁面

2.我們登錄的界面是Login.jsp

2.配置我們的DD


	
		loginFilter
		com.filter.LoginFilter
	
	
		loginFilter
		/admin/*
	
	
		Login
		com.filter.Login
	
	
		Login
		/Login.do
	
在下面的這段DD中:
	
		loginFilter
		/admin/*
	
我們規定了,那些Url的請求我們是要進行過濾的,如果你是有多個,那麼有多個filter-mapping 標簽就行了。

說明:當我們如果訪問http://localhost:8887/Servlet/admin/requestAction.do 那麼就會調轉到我們登錄的界面如圖:


\



<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+v8nS1L+0vPvO0sPHtcRVcmy12Na3tcS688PmzO2808HL0ru49lJldHVyblVybLXEss7K/TwvcD4KPHA+PGJyPgo8L3A+CjxoMj4zLrHg0LTO0sPHTG9naW4uanNwPC9oMj4KPHByZSBjbGFzcz0="brush:java;"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> NotLoginException.jsp


說明:1.ConfigBean只是我的一個全局的類,裡面包含了一些系統常用的參數,比如說我這裡的basePath

2.我們把returnUrl 利用El表達式從param中取出來放到input 的隱藏域裡面提交。


4.編寫Login.do

 			
			String userName =	req.getParameter("username");
			String password = req.getParameter("password");
			String returnUrl = req.getParameter("returnUrl");
			System.out.println(returnUrl);
			User user = new User();
			user.setUserName(userName);
			user.setPassword(password);
			//login
			HttpSession session = req.getSession();
			session.setAttribute(ConfigBean.session_login_user, user);
			if(returnUrl != null && returnUrl.trim().length() > 0 ){
				resp.sendRedirect(returnUrl);
			}else{
				//返回 main.jsp 或者是Serlvet
 
			}
			
	


這樣,我們第一個例子就寫完了,第一次請求的時候沒有登錄所以會調轉到登錄的界面,如果我們登錄成功了,那麼會跳回我們最開始訪問的那個界面。

當我們第二次請求(session 沒用過期) 那麼會直接訪問到我們請求的Url地址 (請記住我們這裡是攔截 url中含有/admin/的請求)


5.編寫我們最開始請求的requestAction.do

@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
  			PrintWriter pw =	resp.getWriter() ;
  			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
 			pw.write("MH370");
 			pw.flush();
 			pw.close();
	}



思考:1.有的時候我們是用ajax提交的登錄的數據的,你可以把登錄成功過後,returnUrl的地址放回到 success(data) ,data 中,然後利用js 去發起一個新請求.

2.我們現在看很多的網站的時候,有的登錄界面是在頁面上彈出一個 對話框去登錄。(比如我們需要回復某一個帖子,那麼可能需要你是登錄的人才可以操作,要是想這樣點擊回復的時候,跳轉到新的界面登錄,然後再跳轉回去,好像不太好。)

對於第二個問題,我們可以在點擊“回復”的時候,在上面Filter的處理我們就不用重新定向到一個頁面了,直接通過response返回一個write("openLogin()") ; 這樣我們在頁面引入對應的js 就可以彈開我們登錄界面了。



現在有個問題? 如果是我請求的Url中帶有查詢參數,現在的測試結果是我們沒有傳遞過去。






  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved