struts2 攔截器的配置

 最近換了家新公司,主要負責前後臺交互這塊,用的ssh框架,所以我接觸的是struts和前端較多,現在總結一下配置攔截器的一些知識,鞏固一下。

struts2攔截器可以攔截一些請求,比如用戶沒登陸就想訪問某個頁面,比如用戶沒有某個頁面的訪問權限,卻發送訪問請求,這些都是要被攔截下來的,基於這些需求,我研究了一下struts2的攔截器。

  要使用攔截器,首先需要在struts.xml中配置,配置文件如下:

<struts>
        <package name="publicInterceptor" extends="global">

                <interceptors>
                        <!-- 登錄攔截器 -->
                        <interceptor name="logon" class="com.arche.alderman.Interceptor.LoginInterceptor"/>
                        <!-- 登錄攔截器堆棧 -->
                        <interceptor-stack name="publicLoginStack">
                                <interceptor-ref name="logon"/>
                                <!-- 引用默認的攔截器堆棧 -->
                                <interceptor-ref name="defaultStack"/>
                        </interceptor-stack>
                </interceptors>

                <global-results>
                        <result name="result_json">/WEB-INF/index/index.jsp</result>
                </global-results>

                <action name="public_oper_userLogin" class="com.arche.alderman.mvc.pub.controller.implement.PublicOperAction" method="userLogin">

                        <interceptor-ref name="publicLoginStack" />
                        <result name="result_json" type="json">
                                <param name="root">mResult</param>
                        </result>
                        <result name="input">/WEB-INF/index/index.jsp</result>
                        <result name="association"></result>
                        <result name="engineer"></result>
                        <result name="enterprise"></result>
                </action>

                <action name="public_check_*" class="com.arche.alderman.mvc.pub.controller.implement.PublicCheckAction" method="{1}">
                        <result name="result_json" type="json">
                                <param name="root">mResult</param>
                        </result>
                </action>

        </package>
</struts>

值得注意的是,定義的攔截器棧名和interceptor-stack的name必須保持一致。

注意:

<default-interceptor-ref name="publicLoginStack"/>

這段代碼的作用是在整個package中的所有action,不管有沒有寫調用攔截器的這段代碼:

<interceptor-ref name="publicLoginStack" />

都會默認調用攔截器,所以當有多個action時,需要手動添加上面這句代碼,並且刪除掉

<default-interceptor-ref name="publicLoginStack"/>

配置好了後,我們需要寫一個interceptor類,來處理用戶訪問的請求(允許訪問還是不允許等),這個類即上面<interceptor>的 class屬性中的LoginInterceptor.java:

com.arche.alderman.Interceptor;

com.arche.alderman.constant.RequestInteractionString;
com.arche.alderman.constant.ServerCommonString;
com.arche.alderman.mvc.pub.vo.UserLoginInfo;
com.opensymphony.xwork2.ActionInvocation;
;
java.util.Map;

LoginInterceptor {
    String intercept(ActionInvocation actionInvocation) Exception {

        String name = actionInvocation.getInvocationContext().getName();
        (name.equals()) {
            actionInvocation.invoke();
        } {
            Map session = actionInvocation.getInvocationContext().getSession();
            (== session || session.isEmpty()) {
                ServerCommonString.;
            } {
                UserLoginInfo userLoginInfo = (UserLoginInfo) session.get(RequestInteractionString.);
                (== userLoginInfo){
                    ServerCommonString.;
                }{
                    (!= userLoginInfo.getUserId() || != userLoginInfo.getUserName() || != userLoginInfo.getUserType()) {
                        actionInvocation.invoke();
                    } {
                        ServerCommonString.;
                    }
                }

            }
        }
    }
}


需要特別注意的是,這個類要繼承AbstractInterceptor類,然後重寫interceptor()方法。

大概就是這些,挺簡單的!

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