過濾器和攔截器的比較及未登錄用戶權限限制的實現

轉載自:http://blog.csdn.net/zlcoy_1/article/details/5009198


需要實現的功能:判斷用戶是否已登錄,未登錄用戶禁止訪問任何頁面或action,自動跳轉到登錄頁面。

過程:因爲對過濾器和攔截器都不熟悉,開始兩種方式都問題不斷,後調試通過,貼在這裏留作小結和備忘


過濾器filter實現

配置:web.xml

<filter>
  	<filter-name>RightFilter</filter-name>
	<filter-class>com.***.rights.RightFilter</filter-class>
</filter>
<filter-mapping>
  	<filter-name>RightFilter</filter-name>
  	<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
  	<filter-name>RightFilter</filter-name>
  	<url-pattern>*.action</url-pattern>
</filter-mapping>



代碼:

mport 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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class RightFilter extends HttpServlet implements Filter {

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		HttpServletResponse response = (HttpServletResponse) arg1;  
		HttpServletRequest request=(HttpServletRequest)arg0;
		HttpSession session = request.getSession(true);  
		String usercode = (String) session.getAttribute("usercode");//
		String url=request.getRequestURI();
		if(usercode==null || usercode.equals(""))
		{
			//判斷獲取的路徑不爲空且不是訪問登錄頁面或執行登錄操作時跳轉
			if(url!=null && !url.equals("") && ( url.indexOf("Login")<0 && url.indexOf("login")<0 ))
			{
				response.sendRedirect("登錄路徑");
				return ;
			}			
		}
			//已通過驗證,用戶訪問繼續
			arg2.doFilter(arg0, arg1);
			return;
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}



配置中的filter-mapping,定義的是需過濾的請求類型,上面的配置即過濾所有對jsp頁面和action的請求。過濾器的實現與struts2、spring框架無關,在用戶請求被相應前執行,在過濾器中,可使用response.sendRedirect("")等方法

跳轉到需要的鏈接,如登錄頁面、錯誤頁面等,不需要跳轉時,arg2.doFilter(arg0, arg1);即可繼續執行用戶的請求。注意使用filter時避免連續兩次跳轉,否則會報java.lang.IllegalStateException錯誤,具體配置方法網上有,除非必要,不建議使用/*(過濾所有訪問)的配置方式,這樣配置,圖片、js文件、css文件等訪問都會被過濾

 

 

攔截器interceptor實現:

配置:struts.xml

   <interceptors>  
	<!--定義一個名爲authority的攔截器-->  
	<interceptor  class="com.***.rights.RightInterceptor" name="rightInterceptor"/>  
	<!--定義一個包含權限檢查的攔截器棧-->  
	<interceptor-stack name="mydefault">  
	<!--配置內建默認攔截器-->  
	<interceptor-ref name="defaultStack"/>  
	<!--配置自定義的攔截器-->  
	<interceptor-ref name="rightInterceptor"/>  
	</interceptor-stack>  
	</interceptors>  
	<default-interceptor-ref name="mydefault" />  
	<!--定義全局Result-->  
  	<global-results> 
  		<result name="login">Login.jsp</result>  
		<result name="error">/error.jsp </result> 
	</global-results>   		




代碼:

import java.util.HashMap;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.ActionContext;
public class RightInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		//System.out.println("攔截器開始驗證");
		try
		{
			ActionContext actionContext = ActionContext.getContext();
			Map<String,Object> session = actionContext.getSession();
	        String user=session.get("usercode").toString();   
	        //當前用戶session無效且訪問的action不是登錄action時,執行攔截,跳轉
	        if((user==null || user.equals("")) && !invocation.getAction().getClass().getName().equals("登錄action")) 
	        {
	            return Action.LOGIN;
	        }
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return Action.LOGIN;
		}
        //System.out.println("攔截器通過驗證");
        return invocation.invoke();//執行訪問的action
		

	}

}

攔截器由spring管理,只對action起作用,不能攔截jsp頁面、圖片等其他資源。攔截器截獲用戶對action的訪問,如需要跳轉,只需如action一樣返回一個result,spring根據result的配置執行跳轉。如無需跳轉,可調用invocation.invoke();方法來執行用戶請求的action。攔截器在action之前開始,在action完成後結束(如被攔截,action根本不執行)

 

 

如不進行處理,過濾器和攔截器都會將正常的登錄操作屏蔽,因此過濾器中需要判斷用戶訪問的url是否爲登錄操作或登錄頁面,攔截器中需要判斷用戶訪問的action是否登錄action。(暫未考慮其他區分方法,留問。)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章