struts2 已有攔截器使用以及自定義攔截器使用


1.struts2 已有攔截器的使用

官方文檔解釋:攔截器是動態攔截Action調用的對象,攔截器提供一種機制,允許開發者定義一段Action執行前或執行后的代碼,也允許在一個Action執行前阻止其執行。

在struts2-core-..jar包里,有struts-default.xml,這里定義了已有的攔截器。想使用的話,直接在自己工程的struts.xml中加入代碼:

<include file="struts-default.xml"></include>

例如,使用已有的timer攔截器,struts配置如下:

 1 <!DOCTYPE struts PUBLIC
2 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
3 "http://struts.apache.org/dtds/struts-2.0.dtd">
4 <struts>
5 <include file ="struts-default.xml"/>
6 <package name ="wen" extends ="struts-default">
7 <action name ="Timer" class ="wen.TimerInterceptorAction">
8 <interceptor-ref name ="timer"/>
9 <result>/Timer.jsp</result>
10 </action>
11 </package>
12 </struts>

 

2.struts2 自定義攔截器的使用

我的工程目錄如下:

 

 


 

為了方便理解,在代碼里添加了后台打印

 

 

 

 

 

 

(1)AuthorizatedAccess.java  模擬訪問受限資源

 1 package com.action;
2
3 import com.opensymphony.xwork2.ActionSupport;
4
5 public class AuthorizatedAccess extends ActionSupport implements RoleAware{
6
7 private String role;
8 public void setRole(String role) {
9 // TODO Auto-generated method stub
10 System.out.println(AuthorizationInterceptor.counter++ + " AuthorizatedAccess setRole " + role);
11 this.role = role;
12 }
13 public String getRole(){
14 System.out.println(AuthorizationInterceptor.counter++ + " AuthorizatedAccess getRole " + role);
15 return role;
16 }
17 @Override
18 public String execute() throws Exception {
19 // TODO Auto-generated method stub
20 System.out.println(AuthorizationInterceptor.counter++ + " AuthorizatedAccess.execute()");
21 return SUCCESS;
22 }
23 }

(2)AuthorizationInterceptor.java  自定義攔截器

 1 package com.action;
2
3 import java.util.Map;
4
5 import org.omg.CORBA.PUBLIC_MEMBER;
6
7 import com.opensymphony.xwork2.Action;
8 import com.opensymphony.xwork2.ActionInvocation;
9 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
10 import com.sun.org.apache.commons.collections.StaticBucketMap;
11
12 public class AuthorizationInterceptor extends AbstractInterceptor{
13 public static int counter = 0;
14
15 @Override
16 public String intercept(ActionInvocation ai) throws Exception {
17 // TODO Auto-generated method stub
18 Map session = ai.getInvocationContext().getSession();
19 String role = (String)session.get("ROLE");
20 if (null != role) {
21 System.out.println(counter++ + " AuthorizationInterceptor role != null .......and role===" + role);
22 Object object = ai.getAction();
23 if (object instanceof RoleAware) {
24 RoleAware action = (RoleAware)object;
25 action.setRole(role);
26 }
27 String hahaString = ai.invoke();
28 System.out.println(counter++ + " AuthorizationInterceptor ai.invoke()====" + hahaString);
29 return haha;
30 }else {
31 System.out.println(counter++ + " AuthorizationInterceptor role == null .......");
32 return Action.LOGIN;
33 }
34 }
35
36 }

(3)Login.java

 1 package com.action;
2
3 import java.util.Map;
4
5 import org.apache.struts2.interceptor.SessionAware;
6
7 import com.opensymphony.xwork2.ActionSupport;
8
9 public class Login extends ActionSupport implements SessionAware{
10 private String role;
11 private Map session;
12 public String getRole(){
13 System.out.println(AuthorizationInterceptor.counter++ + " Login getRole()...." + role);
14 return role;
15 }
16
17 public void setRole(String role){
18 System.out.println(AuthorizationInterceptor.counter++ + " Login setRole()...." + role);
19 this.role = role;
20 }
21 public void setSession(Map session) {
22 // TODO Auto-generated method stub
23 this.session = session;
24 System.out.println(AuthorizationInterceptor.counter++ + " Login setSession=====" + session);
25 }
26
27 @Override
28 public String execute() throws Exception {
29 // TODO Auto-generated method stub
30 System.out.println(AuthorizationInterceptor.counter++ + " Login execute 獲取role======" + role);
31 session.put("ROLE", role);
32 return SUCCESS;
33 }
34 }

(4)RoleAware.java

1 package com.action;
2
3 public interface RoleAware {
4 void setRole(String role);
5 }

(5)Roles.java

 1 package com.lihui;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 public class Roles {
7 public Map<String, String> getRoles(){
8 Map<String, String> roles = new HashMap<String, String>();
9 roles.put("EMPLOYEE", "員工");
10 roles.put("MANAGER", "老板");
11 return roles;
12 }
13 }

(6)Login.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2 <%@ taglib prefix="s" uri="/struts-tags"%>
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <html>
5 <head>
6 <title>登錄</title>
7 </head>
8
9 <body>
10 <h1>Login</h1>
11 請選擇一個角色:
12 <s:bean id="roles" name="com.lihui.Roles"/>
13 <s:form action="login">
14 <s:radio list="#roles.roles" value="EMPLOYEE" name="role" label="角色"></s:radio>
15 <s:submit value="提交"></s:submit>
16 </s:form>
17 </body>
18 </html>

(7)ShowUser.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2 <%@ taglib prefix="s" uri="/struts-tags" %>
3
4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
5 <html>
6 <head>
7 <title>顯示用戶的角色</title>
8 </head>
9
10 <body>
11 <h1>您的角色是:
12 <s:property value="role"/>
13 </h1>
14 </body>
15 </html>

(8)struts.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE struts PUBLIC
3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4 "http://struts.apache.org/dtds/struts-2.0.dtd">
5 <struts>
6 <include file="struts-default.xml"></include>
7 <package name="com.action" extends="struts-default" namespace="/test">
8 <interceptors>
9 <interceptor name="auth" class="com.action.AuthorizationInterceptor"></interceptor>
10 </interceptors>
11 <action name="login" class="com.action.Login">
12 <result type="chain">
13 <param name="actionName">authorizatedAccess</param>
14 <param name="namespace">/test</param>
15 </result>
16 </action>
17 <action name="authorizatedAccess" class="com.action.AuthorizatedAccess">
18 <interceptor-ref name="auth"></interceptor-ref>
19 <result name="success">/pages/ShowUser.jsp</result>
20 <result name="SUCCESS">/pages/ShowUser.jsp</result>
21 <result name="login">/pages/Login.jsp</result>
22 </action>
23 </package>
24 </struts>

然后輸入網址:http://localhost:8080/Struts2Proj/test/authorizatedAccess.action 之所以中間還有個 /test 是因為程序中用了命名空間 namespace="/test"。而又之所以使用命名空間是因為在配置 struts.xml 時報錯。

網頁顯示如下:

 

第二個圖是在一個圖選擇了員工並點擊提交之后顯示的界面。至於程序到底是怎么運行的,看一下后台輸出就知道了。

0:一開始的時候 Role 肯定是空的,所以直接跳向登錄界面。

在登錄界面,選擇了某個角色之后,點擊提交,根據struts.xlml 首先會調用登錄類 Login.java ,然后跳轉到AuthorizatedAccess這個action,然后在這個action調用時先調用攔截器,如果role不為空,則通過 ai.invoke() 來調用AuthorizationInterceptor.java ,最后根據 AuthorizationInterceptor.java   的返回結果確定調用 Login.jsp 還是 ShowUser.jsp.








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM