1. 程式人生 > >java 自定義攔截器

java 自定義攔截器

一、攔截器

 過濾器作用於Web端,而攔截器作用於整個java,作用範圍也就更加的廣泛

二、下面就對攔截器在開發中的使用做一個例子舉例說明

以使用者登陸為例子,使用者在登陸後,才能訪問其他頁面,如果沒有登陸,就跳轉到登陸頁面,此時我們用攔截器來實現

三、攔截器的簡單示例

1.web頁面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>自定義攔截器</title>
	</head>
	<body>
		demo1.jsp
		<%System.out.println("demo1.jsp執行了"); %>
	</body>
</html>

2.後端aciton

public class Demo1Action extends ActionSupport {

	public String save(){
		System.out.println("Demo1Action的動作方法執行了");
		return SUCCESS;
	}
}

3.定義簡單的攔截器

/**
 * 自定義攔截器
 * 	第一步:建立一個普通類,繼承AbstractInterceptor,實現抽象方法intercept
 *  第二步:在struts.xml中配置攔截器
 *  	 1.宣告攔截器
 *  		<interceptors>
				<interceptor name="demo1Interceptor" class="com.itheima.web.interceptor.Demo1Interceptor" />
			</interceptors>
		 2.使用攔截器
		 	<!-- 使用自定義攔截器:當配置了任何一個攔截器,預設的攔截器棧就不會在工作了 -->
			<interceptor-ref name="demo1Interceptor"></interceptor-ref>
 *
 */
/**
 * 此攔截器主要是對action進行攔截
 * @author Administrator
 *
 */
public class Demo1Interceptor extends AbstractInterceptor {

	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("Demo1Interceptor攔截器:攔截了-執行動作方法之前");
		//放行:如果有下一個攔截器,就前往下一個攔截器,如果沒有了,就到達動作方法
		String rtValue = invocation.invoke();//就是結果檢視的名稱
		System.out.println("Demo1Interceptor攔截器:攔截了-執行動作方法之後");
		return rtValue;
	}

}

4、配置檔案struts.xml中進行配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<constant name="struts.devMode" value="true" />
	<package name="p1" extends="struts-default">
		<!-- 宣告自定義攔截器 -->
		<interceptors>
			<interceptor name="demo1Interceptor" class="com.struts.web.interceptor.Demo1Interceptor"></interceptor>
			<interceptor name="demo2Interceptor" class="com.struts.web.interceptor.Demo2Interceptor"></interceptor>
		</interceptors>
		<action name="action1" class="com.itheima.web.action.Demo1Action" method="save">
			<!-- 使用自定義攔截器:當配置了任何一個攔截器,預設的攔截器棧就不會在工作了 .
				當有多個攔截器的時候,是由引用配置決定執行的順序 。 注意:執行順序與宣告無關-->
			<interceptor-ref name="demo2Interceptor"></interceptor-ref>
			<interceptor-ref name="demo1Interceptor"></interceptor-ref>
			<result name="success">/demo1.jsp</result>
		</action>
	</package>
	

</struts>

此時,一個簡單的攔截器就完成了

四、自定義複雜攔截器,具有自己的攔截功能示例,以session共享為例,跳到其他頁面

1.web頁面 

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>使用者登入</title>
	</head>
	<body>
		<form action="${pageContext.request.contextPath}/login.action" method="post">
			使用者名稱:<input type="text" name="username"/><br/>
			密碼:<input type="password" name="password"/><br/>
			<input type="submit" value="登入"/>
		</form>
	</body>
</html>

主頁面main.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>主頁:檢查登入的攔截器</title>
	</head>
	<body>
		<%--要想來到本頁面(主頁),必須得先登入 --%>
		主頁<hr/>
		<a href="${pageContext.request.contextPath}/showOther.action">訪問另一個頁面</a>
	</body>
</html>

其他頁面otherPage.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>另一個頁面</title>
	</head>
	<body>
		另一個頁面
	</body>
</html>

2.攔截器

/**
 * 檢查登入的攔截器,最終版本
 *
 */
//  c
public class CheckLoginInterceptor1 extends MethodFilterInterceptor {

	public String doIntercept(ActionInvocation invocation) throws Exception {
		//1.獲取HttpSession
		HttpSession session = ServletActionContext.getRequest().getSession();
		//2.獲取session域中的登入標記
		Object obj = session.getAttribute("user");
		//3.判斷是否有登入標記
		if(obj == null){
			//使用者沒有登入
			return "input";
		}
		//4.使用者登入了,放行
		String rtValue = invocation.invoke();
		return rtValue;
	}

}

3.使用者登陸action

public class Demo2Action extends ActionSupport {
	
	
	/**
	 * 使用者登入的方法
	 * @return
	 */
	public String login(){
		HttpSession session = ServletActionContext.getRequest().getSession();
		session.setAttribute("user", "test");
		return SUCCESS;
	}
	
	
	/**
	 * 無論是顯示主頁還是顯示另一個頁面都執行此方法,
	 * 返回成功
	 */
	public String execute(){
		return SUCCESS;
	}
}

4.struts.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<constant name="struts.devMode" value="true" />

	
	<package name="p2" extends="struts-default">
		<interceptors>
			<interceptor name="checkLoginInterceptor1" class="com.struts.web.interceptor.CheckLoginInterceptor1" />
			<interceptor-stack name="myDefaultStack">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="checkLoginInterceptor1"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
		<global-results>
			<result name="input">/login.jsp</result>
		</global-results>
		
		<action name="login" class="com.struts.web.action.Demo2Action" method="login">
			<interceptor-ref name="myDefaultStack">
				<!-- 在引用自定義攔截器棧的時候,給指定的攔截器注入引數。方式就是:攔截器名稱.屬性名稱 
					excludeMethods:哪些方法不需要攔截
			     	includeMethods:哪些方法需要攔截
				-->
				<param name="checkLoginInterceptor1.excludeMethods">login</param>
			</interceptor-ref>
			<!-- redirectAction: 可以當前包中重定向,也可以是不同包中重定向
				chain:可以當前包中轉發,也可以是不同包中轉發
			  -->
			<result   type="redirectAction">
                <!-- 同一個包下,此處可以不寫-->
				<param name="namespace">/</param>
				<param name="actionName"  >showMain</param>
			</result>
		</action>
		<action name="showMain" class="com.struts.web.action.Demo2Action" >
			<result>/main.jsp</result>
		</action>		
		<action name="showOther" class="com.struts.web.action.Demo2Action" >
			<result>/otherpage.jsp</result>
		</action>
	</package>
</struts>

5.web.xml配置

  <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>