struts2 攔截器的配置
阿新 • • 發佈:2019-01-24
最近換了家新公司,主要負責前後臺互動這塊,用的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-refname="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()方法。
大概就是這些,挺簡單的!