struts2註解下的攔截器配置
貌似這個這問題已經糾結了半年了,網上找資料也不是很多。上週六除錯通了。借CSDN mark一下吧。
一 、實現
1、 首先上攔截器部分的程式碼
- publicclass CheckLoginInterceptor extends AbstractInterceptor {
- privatestaticfinallong serialVersionUID = 1L;
- publicstaticfinal String USER_SESSION_KEY = "user";
-
private Logger LOG = Logger.getLogger(CheckLoginInterceptor.
- @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
- // 存在的情況下進行後續操作。
- LOG.info(username + " already login!");
- return actionInvocation.invoke();
- } else {
- // 否則終止後續操作,返回LOGIN
- LOG.info("no login, forward login page!");
- return Action.LOGIN;
- }
- }
- }
2、然後就是struts.xml的內容
- <?xmlversion="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>
- <packagename="custom-default"extends="struts-default">
- <!-- 繼承預設的 struts2 配置檔案 -->
- <interceptors>
- <interceptorname="checkLogin"
- class="com.cmcc.intt.util.CheckLoginInterceptor"/>
- <interceptor-stackname="checkLoginStack">
- <interceptor-refname="checkLogin"></interceptor-ref>
- <interceptor-refname="defaultStack"></interceptor-ref>
- </interceptor-stack>
- </interceptors>
- <!-- 設定全域性 全域性預設的攔截器棧-->
- <default-interceptor-refname="checkLoginStack"></default-interceptor-ref>
- <!-- 定義全域性Result -->
- <global-results>
- <!-- 當返回login檢視名時,轉入/login.jsp頁面 -->
- <resultname="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") })
- publicclass LoginAction extends ActionSupport {
- public String param = null;
- privatestaticfinallong 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 ………………)
- }
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 |
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") })
- publicclass SignAction extends ActionSupport {
- privatestaticfinallong 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