Struts2攔截器實現原理
攔截器的實現主要靠得是一個攔截器鏈,另外的一個是攔截器的呼叫的類,它的目的就是在真正執行Action方法之前加入一些額外的處理程式碼
Action類
public class Action {
public String execute() {
return "success";
}
}
攔截器介面:
public interface Interceptor {
public void intercept(ActionInvocation invocaion);
}
攔截器實現類1
public class FirstInterceptor implements Interceptor {
@Override
public void intercept(ActionInvocation invocaion) {
System.out.println("first before");
invocaion.invoke();
System.out.println("first end");
}
}
攔截器實現類2
public class SecondInterceptor implements Interceptor {
@Override
public void intercept(ActionInvocation invocaion) {
System.out.println("second before");
invocaion.invoke();
System.out.println("second end");
}
}
ActionInvocation類
public class ActionInvocation {
private List<Interceptor> interceptors=new ArrayList<Interceptor>();
private int index=-1;
Action action = new Action();
public ActionInvocation() {
interceptors.add(new FirstInterceptor());
interceptors.add(new SecondInterceptor());
}
public void invoke() {
index++;
if(index>=interceptors.size()) {
action.execute();
} else {
interceptors.get(index).intercept(this);
}
}
}
呼叫攔截器測試類
public class Test{
public static void main(String[] args) {
System.out.println("main before");
new ActionInvocation().invoke();
System.out.println("main before");
}
}
自定義攔截器:
自定義攔截器必須要實現Interceptor介面
public class MyInterceptor implements Interceptor {
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
long start = System.currentTimeMillis();
String r = invocation.invoke();
long end = System.currentTimeMillis();
System.out.println("action time = " + (end - start));
return r;
}
}
使用的時候需要在struts.xml檔案中進行配置,而且攔截器是必須配置在包裡面的.
<action name="test" class="com.bjsxt.action.TestAction">
<result>/test.jsp</result>
<interceptor-ref name="my"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
因為每一個攔截器都是攔截的一個指定的請求,所以攔截器需要定義在具體Action裡面
使用struts2 token攔截器:
這個攔截器主要是為了防止客戶重複提交表單而加入的
使用token標籤的時候,Struts2會建立一個GUID(全域性唯一的字串)放在session中,並且會成為一個hidden放在form中。
token攔截器會判斷客戶端form提交的token和session中儲存的session是否equals。如果equals則執行Action。否則攔截器直接返回invaid.token結果,Action對應的方法也不會執行介面.
使用步驟:
1.在對應的需要防止客戶重複提交表單的Action裡面加入攔截器
<action name="user" class="com.bjsxt.action.UserAction">
<result>/addOK.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
<!--當表單重複提價的時候指向的頁面-->
<result name="invalid.token">/error.jsp</result>
</action>
<form action="test/input">
輸入姓名:<input type="text" name="name"/>
<input type="submit" value="提交"/>
<s:token/>
相關文章
- Java實現的攔截器Java
- Struts2 原始碼分析-----攔截器原始碼解析 --- ParametersInterceptor原始碼
- SpringMVC中的攔截器Interceptor實現SpringMVC
- Mybatis 分頁:Pagehelper + 攔截器實現MyBatis
- axios攔截器原理是什麼?iOS
- SpringBoot實現過濾器、攔截器與切片Spring Boot過濾器
- Flume內建攔截器與自定義攔截器(程式碼實戰)
- Autofac實現攔截器和切面程式設計程式設計
- 前端架構之vue+axios 前端實現登入攔截(路由攔截、http攔截)前端架構VueiOS路由HTTP
- SpringBoot中的過濾器和攔截器的實現Spring Boot過濾器
- 高併發微信域名攔截檢測介面實現原理
- flutetr dio 攔截器實現 token 失效重新整理
- vue中使用el-dialog + axios 實現攔截器VueiOS
- SpringBoot自定義攔截器實現IP白名單功能Spring Boot
- MyBatis攔截器優雅實現資料脫敏MyBatis
- Spring MVC 中的攔截器的使用“攔截器基本配置” 和 “攔截器高階配置”SpringMVC
- SpringMVC攔截器SpringMVC
- axios 攔截器iOS
- spring攔截器Spring
- axios攔截器iOS
- sql攔截器SQL
- Mybatis 攔截器MyBatis
- MyBatis攔截器MyBatis
- SpringMVC攔截器,設定不攔截的URLSpringMVC
- SpringCache框架載入/攔截原理SpringGC框架
- Mybatis Interceptor 攔截器MyBatis
- spring boot 攔截器Spring Boot
- SpringMVC-攔截器SpringMVC
- gRPC(3):攔截器RPC
- 【SpringMVC】 4.3 攔截器SpringMVC
- 小程式手動實現路由攔截路由
- SpringBoot 整合 Shiro 實現登入攔截Spring Boot
- Asp.Netcore使用Filter來實現介面的全域性異常攔截,以及前置攔截和後置攔截ASP.NETNetCoreFilter
- SpringBoot攔截器中獲取註解、攔截器中注入ServiceSpring Boot
- vue.js新增攔截器,實現token認證(使用axios)Vue.jsiOS
- SSM專案使用攔截器實現登入驗證功能SSM
- 聊聊如何實現一個帶有攔截器功能的SPI
- Day71 Spring MVC的攔截器和執行原理SpringMVC
- Spring Boot新增攔截器Spring Boot