Struct2_定义拦截器并使用注解方式作用在Action的方法中
生活随笔
收集整理的這篇文章主要介紹了
Struct2_定义拦截器并使用注解方式作用在Action的方法中
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、目的:通過在方法上加注解控制哪些方法需要登陸后才能訪問
二、方式:利用攔截器判斷用戶是否登陸 ? 三、實現步驟struts.xml添加節點
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <package name="custom-default" extends="struts-default"> ????????<interceptors> ????????????<!-- 聲明自定義的權限控制攔截器 --> ????????????<interceptor name="loginInterceptor" class="interceptors.LoginInterceptor" /> ????????????<!-- 把自定義的權限控制攔截器和默認的攔截器棧加到新的自定義的攔截器棧 --> ????????????<interceptor-stack name="myInterceptors"> ????????????????<interceptor-ref name="loginInterceptor" /> ????????????????<interceptor-ref name="defaultStack" /> ????????????</interceptor-stack> ????????</interceptors> ????????<!-- 指定新的自定義的攔截器棧為默認的攔截器棧,這樣自定義的權限控制攔截器就可以發揮作用了 --> ????????<!-- 這里name屬性值對應的是上述interceptor-stack name屬性值 --> ????????<default-interceptor-ref name="myInterceptors"></default-interceptor-ref> ????????? ????????<!-- 這里對應攔截器中return Action.LOGIN對應的頁面--> ????????<global-results> ????????????<result name="login">/WEB-INF/content/LoginInfo/login.jsp</result> ????????</global-results> ????</package> |
定義注解
注解主要是作用在方法上,攔截器根據方法是否定義注解來處理登陸判斷
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD}) @Retention(value = RetentionPolicy.RUNTIME) public @interface Authority { ?????/** ?????* @return? The namespace value. ?????*/ ????String value(); } |
定義攔截器
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package interceptors; import java.lang.reflect.Method; import java.util.Map; import org.apache.struts2.convention.annotation.InterceptorRef; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import annotations.Authority; import common.Constants; @SuppressWarnings("serial") public class LoginInterceptor extends AbstractInterceptor { ????@Override ????public String intercept(ActionInvocation invocation) throws Exception { ????????String methodName = invocation.getProxy().getMethod(); ????????Class clazz = invocation.getAction().getClass(); // 獲取類對象 ????????Method currentMethod = clazz.getMethod(methodName); //獲取攔截的方法 ????????? ????????//方法上添加了注解 ????????if (currentMethod.isAnnotationPresent(Authority.class)) { ????????????// 取得當前請求的注解的action ????????????ActionContext context = invocation.getInvocationContext(); ????????????Map session = context.getSession(); ????????????//Constants.UserName=="UserName" ????????????String user = (String) session.get(Constants.UserName); ????????????System.err.println("攔截器起作用"); ????????????if (user == null) // 未登陸,跳轉到登錄頁 ????????????{ ????????????????System.err.println("進入攔截器:未登陸"); ????????????????context.put("tip", "你還沒有登錄"); ????????????????return Action.LOGIN; ????????????} else {?? //已登錄,繼續后續流程 ????????????????System.err.println("進入攔截器:已登錄"); ????????????????return invocation.invoke(); ????????????} ????????} else { ????????????System.err.println("進入攔截器:沒有使用注解"); ????????????return invocation.invoke(); ????????} ????} } |
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package action; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.InterceptorRef; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import org.apache.struts2.interceptor.validation.SkipValidation; import annotations.Authority; import common.Constants; import org.apache.struts2.convention.annotation.InterceptorRefs; @SuppressWarnings("serial") @ParentPackage("custom-default")?? //這里對應的配置文件中包的名稱 public class LoginAction extends SuperActionSupport { ????@Action(value = "loginValidate", results = { ????????????@Result(name = "success", location = "/WEB-INF/content/LoginInfo/success.jsp"), ????????????@Result(name = "input", location = "/WEB-INF/content/LoginInfo/login.jsp") }) ????@Authority("")? //定義注解后未登錄回到登陸頁,否則執行后續步驟 ????public String loginValidate() throws Exception { ????????return SUCCESS; ????} } |
內置的注解@InterceptorRefs/@InterceptorRef只能作用在類文件上,不能作用到方法上(從其@Target屬性即可看出)
類上的注解@ParentPackage("custom-default")必須對應structs.xml中package的name屬性,否則注解不起效
structs.xml中default-interceptor-ref的name值對應的是interceptor-stack的name值,否則注解不起效
?
五、參考資料?
轉載于:https://www.cnblogs.com/gossip/p/5195764.html
總結
以上是生活随笔為你收集整理的Struct2_定义拦截器并使用注解方式作用在Action的方法中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 400字读后感大全30篇
- 下一篇: 过目不忘的童装店名281个