<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的漫漫程序之旅

    專注于JavaWeb開發(fā)
    隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
    數(shù)據(jù)加載中……

    自定義攔截器

    作為“框架(framework)”,可擴展性是不可或缺的,因為世上沒有放之四海而皆準的東西。雖然,Struts 2為我們提供如此豐富的攔截器實現(xiàn),但是這并不意味我們失去創(chuàng)建自定義攔截器的能力,恰恰相反,在Struts 2自定義攔截器是相當容易的一件事。

      大家在開始著手創(chuàng)建自定義攔截器前,切記以下原則:
    攔截器必須是無狀態(tài)的,不要使用在API提供的ActionInvocation之外的任何東西。

        要求攔截器是無狀態(tài)的原因是Struts 2不能保證為每一個請求或者action創(chuàng)建一個實例,所以如果攔截器帶有狀態(tài),會引發(fā)并發(fā)問題。

         所有的Struts 2的攔截器都直接或間接實現(xiàn)接口com.opensymphony.xwork2.interceptor.Interceptor。除此之外,大家可能更喜歡繼承類com.opensymphony.xwork2.interceptor.AbstractInterceptor。

    以下例子演示通過繼承AbstractInterceptor,實現(xiàn)授權(quán)攔截器。

    首先,創(chuàng)建授權(quán)攔截器類tutorial.AuthorizationInterceptor,代碼如下:

     package tutorial;

     import java.util.Map;

     import com.opensymphony.xwork2.Action;
     import com.opensymphony.xwork2.ActionInvocation;
     import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

     public class AuthorizationInterceptor extends AbstractInterceptor  {

        @Override
        
    public String intercept(ActionInvocation ai) throws Exception  {
            Map session
    = ai.getInvocationContext().getSession();
            String role
    = (String) session.get( " ROLE " );
            
    if ( null != role)  {
                Object o
    = ai.getAction();
                
    if (o instanceof RoleAware)  {
                    RoleAware action
    = (RoleAware) o;
                    action.setRole(role);
                }
     

               
    return ai.invoke();
            }
    else  {
                
    return Action.LOGIN;
            }
     
           
        }
     


    }

    以上代碼相當簡單,我們通過檢查session是否存在鍵為“ROLE”的字符串,判斷用戶是否登陸。如果用戶已經(jīng)登陸,將角色放到Action中,調(diào)用Action;否則,攔截直接返回Action.LOGIN字段。為了方便將角色放入Action,我定義了接口tutorial.RoleAware,代碼如下:

     package tutorial;

     public interface RoleAware  {
        
    void setRole(String role);
    }

    接著,創(chuàng)建Action類tutorial.AuthorizatedAccess模擬訪問受限資源,它作用就是通過實現(xiàn)RoleAware獲取角色,并將其顯示到ShowUser.jsp中,代碼如下:

     package tutorial;

     import com.opensymphony.xwork2.ActionSupport;

     public class AuthorizatedAccess extends ActionSupport implements RoleAware  {
        
    private String role;
        
        
    public void setRole(String role)  {
            
    this .role = role;
        }
     

        
        
    public String getRole()  {
            
    return role;
        }
     

     
        @Override
        
    public String execute()  {
            
    return SUCCESS;
        }

    }

    以下是ShowUser.jsp的代碼:

    <% @ page  contentType = " text/html; charset=UTF-8 " %>
    <% @taglib prefix = " s " uri = " /struts-tags " %>
    < html >
    < head >
       
    < title > Authorizated User </ title >
    </ head >
    < body >
       
    < h1 > Your role is: < s:property value ="role" /></ h1 >
    </ body >
    </ html >

    然后,創(chuàng)建tutorial.Roles初始化角色列表,代碼如下:

     package tutorial;

     import java.util.Hashtable;
     import java.util.Map;


     public class Roles  {
        
    public Map < String, String > getRoles()  {
            Map
    < String, String > roles = new Hashtable < String, String > ( 2 );
            roles.put(
    " EMPLOYEE " , " Employee " );
            roles.put(
    " MANAGER " , " Manager " );
            
    return roles;
        }

    }

    接下來,新建Login.jsp實例化tutorial.Roles,并將其roles屬性賦予<s:radio>標志,代碼如下:

    <% @ page  contentType = " text/html; charset=UTF-8 " %>
    <% @taglib prefix = " s " uri = " /struts-tags " %>
    < html >
    < head >
       
    < title > Login </ title >
    </ head >
    < body >
       
    < h1 > Login </ h1 >
        Please select a role below:
       
    < s:bean id ="roles" name ="tutorial.Roles" />
       
    < s:form action ="Login" >
           
    < s:radio list ="#roles.roles" value ="EMPLOYEE" name ="role" label ="Role" />
           
    < s:submit />
       
    </ s:form >
    </ body >
    </ html >

    創(chuàng)建Action類tutorial.Login將role放到session中,并轉(zhuǎn)到Action類tutorial.AuthorizatedAccess,代碼如下:

     package tutorial;

     import java.util.Map;

     import org.apache.struts2.interceptor.SessionAware;

     import com.opensymphony.xwork2.ActionSupport;

     public class Login extends ActionSupport implements SessionAware  {
        
    private String role;    
        
    private Map session;

        
    public String getRole()  {
            
    return role;
        }
     

     
        
    public void setRole(String role)  {
            
    this .role = role;
        }
     

        
        
    public void setSession(Map session)  {
            
    this .session = session;
        }
     

     
        @Override
        
    public String execute()  {
            session.put(
    " ROLE " , role);
            
    return SUCCESS;
        }
     
       
    }

    最后,配置struts.xml文件,內(nèi)容如下:

    <! DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
            "http://struts.apache.org/dtds/struts-2.0.dtd"
    >
    < struts >
       
    < include file ="struts-default.xml" />    
       
    < package name ="InterceptorDemo" extends ="struts-default" >
           
    < interceptors >
               
    < interceptor name ="auth" class ="tutorial.AuthorizationInterceptor" />
           
    </ interceptors >
           
    < action name ="Timer" class ="tutorial.TimerInterceptorAction" >
               
    < interceptor-ref name ="timer" />
               
    < result > /Timer.jsp </ result >
           
    </ action >
           
    < action name ="Login" class ="tutorial.Login" >
               
    < result type ="chain" > AuthorizatedAccess </ result >
           
    </ action >
           
    < action name ="AuthorizatedAccess" class ="tutorial.AuthorizatedAccess" >
               
    < interceptor-ref name ="auth" />
               
    < result name ="login" > /Login.jsp </ result >
               
    < result name ="success" > /ShowRole.jsp </ result >
           
    </ action >
       
    </ package >
    </ struts >

    發(fā)布運行應用程序,在瀏覽器地址欄中輸入:http://localhost:8080/Struts2_Interceptor/AuthorizatedAccess.action。由于此時,session還沒有鍵為“ROLE”的值,所以返回Login.jsp頁面,如圖2所示:

     
    圖2 Login.jsp

    選中Employee,點擊Submit,出現(xiàn)圖3所示頁面:
     

     圖3 ShowRole.jsp

    總結(jié)

    攔截器是Struts 2比較重要的一個功能。通過正確地使用攔截器,我們可以編寫高可復用的代碼。



    posted on 2007-11-24 07:32 々上善若水々 閱讀(4856) 評論(2)  編輯  收藏 所屬分類: Struts2

    評論

    # re: 自定義攔截器  回復  更多評論   

    有啥用啊!
    2014-03-03 21:10 | 家伙死

    # re: 自定義攔截器[未登錄]  回復  更多評論   

    i am a little know the title.
    2015-10-06 22:00 | hehe
    主站蜘蛛池模板: 免费夜色污私人影院网站电影 | 男男gay做爽爽免费视频| 偷自拍亚洲视频在线观看99| 免费观看的毛片手机视频| 亚洲国产成人久久综合区| 亚洲色图在线观看| 亚洲AV无码一区二区大桥未久| 一本大道一卡二大卡三卡免费 | AA免费观看的1000部电影| 亚洲M码 欧洲S码SSS222| 狼人大香伊蕉国产WWW亚洲| 99在线精品视频观看免费| 亚洲AⅤ视频一区二区三区| 亚洲毛片基地日韩毛片基地| 黄页免费视频播放在线播放| 30岁的女人韩剧免费观看| 亚洲女人被黑人巨大进入| 亚洲AV日韩综合一区尤物| 男人的天堂网免费网站| 国产在线播放免费| 亚洲图片校园春色| 777爽死你无码免费看一二区| 亚洲色偷拍区另类无码专区| 亚洲中文无码永久免| 国产精品成人观看视频免费| 色天使亚洲综合在线观看| 亚洲 综合 国产 欧洲 丝袜 | 花蝴蝶免费视频在线观看高清版| 日本免费一本天堂在线| 亚洲免费在线观看视频| 三年片在线观看免费观看大全动漫| 日本免费大黄在线观看| 亚洲无吗在线视频| 手机在线免费视频| 亚洲国产精品午夜电影| 国产成人免费a在线视频app| 久久国产精品成人免费| 亚洲伊人久久大香线蕉苏妲己| 免费看一区二区三区四区| 亚洲av极品无码专区在线观看 | 免费看美女被靠到爽|