struts2註解下的攔截器配置

    貌似這個這問題已經糾結了半年了,網上找資料也不是很多。上週六調試通了。借CSDN mark一下吧。

一  、實現

1、 首先上攔截器部分的代碼

public class CheckLoginInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 1L;
	public static final String USER_SESSION_KEY = "user";
	private Logger LOG = Logger.getLogger(CheckLoginInterceptor.class);

	@Override
	public String intercept(ActionInvocation actionInvocation) throws Exception {
		LOG.info("begin check login interceptor");
		// 對LoginAction不做該項攔截
		Object action = actionInvocation.getAction();
		if (action instanceof LoginAction) {
			LOG.info("exit check login, because this is login action.");
			return actionInvocation.invoke();
		}
		// 驗證 session
		Map<String, Object> session = ActionContext.getContext().getSession();
		String username = (String) session.get(USER_SESSION_KEY);
		LOG.info("username-----------" + username);
		if (username != null) {
			// 存在的情況下進行後續操作。
			LOG.info(username + " already login!");
			return actionInvocation.invoke();
		} else {
			// 否則終止後續操作,返回LOGIN
			LOG.info("no login, forward login page!");
			return Action.LOGIN;
		}
	}
}

2、然後就是struts.xml的內容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<package name="custom-default" extends="struts-default">
		<!-- 繼承默認的 struts2 配置文件 -->
		<interceptors>
			<interceptor name="checkLogin"
				class="com.cmcc.intt.util.CheckLoginInterceptor" />
			<interceptor-stack name="checkLoginStack">
				<interceptor-ref name="checkLogin"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 設置全局 全局默認的攔截器棧-->
		<default-interceptor-ref name="checkLoginStack"></default-interceptor-ref>
		<!-- 定義全局Result -->
		<global-results>
			<!-- 當返回login視圖名時,轉入/login.jsp頁面 -->
			<result name="login">/login.jsp</result>
		</global-results>
	</package>
</struts>


3、LoginAction的代碼(只上關鍵部分,下面也一樣)

@ParentPackage("custom-default")
@InterceptorRefs(@InterceptorRef("checkLoginStack"))
@Results( { @Result(name = SUCCESS, location = "/redirect.jsp"),
		@Result(name = "input", location = "/login.jsp") })
public class LoginAction extends ActionSupport {
	public String param = null;
	private static final long serialVersionUID = -7146549074248299166L;
	private Logger LOG = Logger.getLogger(LoginAction.class);

	public String execute() {
		LOG.info(param);
		Map<String, Object> session = ActionContext.getContext().getSession();
		if (param.equals("1")) {
			session.put("user", "123");
			return SUCCESS;
		} else {
			session.remove("user");
			return "input";
		}
	}
 (public getter  and setter  ………………)
}
附 通過http://localhost:8080/intt/config-browser/index.action   看此action的Action information如下:

Results        
Name Type Parameters
input org.apache.struts2.dispatcher.ServletDispatcherResult location = /login.jsp
success org.apache.struts2.dispatcher.ServletDispatcherResult location = /redirect.jsp
login org.apache.struts2.dispatcher.ServletDispatcherResult location = /login.jsp

    Interceptors    
Name Type
CheckLoginInterceptor com.cmcc.intt.util.CheckLoginInterceptor
……(18個defaultstack的攔截器的第一個) ……………………
……(18個defaultstack的攔截器的第二個) …………
……(18個defaultstack的攔截器的第三個) …………

可以看到  此action繼承了custom-default中定義的login以及CheckLoginInterceptor這個攔截器



4、最後是仿業務邏輯的 代碼


@ParentPackage("custom-default")
@InterceptorRefs(@InterceptorRef("checkLoginStack"))
@Results( { @Result(name = SUCCESS, location = "/redirect.jsp"),
		@Result(name = "input", location = "/login.jsp") })
public class SignAction extends ActionSupport {
	private static final long serialVersionUID = -1326137892057921638L;

	public String execute() {
		System.out.println("SignAction.execute");
		return SUCCESS;
	}
}

  此action的Action information的跟LoginAction一樣,就不說了


二  執行過程  

1 模仿已登錄

http://localhost:8080/intt/login?param=1  模仿登錄(1),完成後瀏覽http://localhost:8080/intt/sign 則顯示 “already login!” (2)

(1)console 顯示 “begin check login interceptor    exit check login, because this is login action.”

(2)console 顯示"begin check login interceptor   username-----------123   123 already login!"

2 模仿未登錄

http://localhost:8080/intt/login?param=2  模仿登錄(1)。 完成後瀏覽http://localhost:8080/intt/sign 則顯示 “please login” (2)

(1)console 顯示 “begin check login interceptor    exit check login, because this is login action.”

(2)console 顯示"begin check login interceptor   username-----------null    no login, forward login page!     Forwarding to location /login.jsp"

 

三    總結

                在util包中寫入類似CheckLoginInterceptor 這樣的攔截器代碼。然後在struts.xml中新增一個package 建立攔截器棧。建好後在action的parentpackage中繼承此package並且攔截器要填入剛纔新建的攔截器棧。

                     如果你在新增的package定義LoginAction 的跳轉映射。對不起哦,這樣做是不行滴。但是如果你把註解的兩個包( struts2-config-browser-plugin-2.2.1.jar, struts2-convention-plugin-2.2.1.jar)拿掉就行了。但這樣一做,就不是註解了撒。


四  運行環境

                   下面我把我的運行環境的 jar包貼出來吧

1)        commons-fileupload-1.2.2.jar

2)        commons-io-1.3.2.jar

3)        commons-lang-2.3.jar

4)        commons-logging-1.1.1.jar

5)        freemarker-2.3.16.jar

6)        javassist-3.11.0.GA.jar

7)        log4j-1.2.16.jar

8)        ognl-3.0.1.jar

9)        struts2-config-browser-plugin-2.2.1.jar

10)    struts2-convention-plugin-2.2.1.jar

11)    struts2-core-2.2.1.jar

12)    xwork-core-2.2.1.jar



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