Struct2_定义拦截器并使用注解方式作用在Action的方法中
生活随笔
收集整理的這篇文章主要介紹了
Struct2_定义拦截器并使用注解方式作用在Action的方法中
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、目的:通過(guò)在方法上加注解控制哪些方法需要登陸后才能訪問(wèn)
二、方式:利用攔截器判斷用戶(hù)是否登陸 ? 三、實(shí)現(xiàn)步驟struts.xml添加節(jié)點(diǎn)
| 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> ????????????<!-- 聲明自定義的權(quán)限控制攔截器 --> ????????????<interceptor name="loginInterceptor" class="interceptors.LoginInterceptor" /> ????????????<!-- 把自定義的權(quán)限控制攔截器和默認(rèn)的攔截器棧加到新的自定義的攔截器棧 --> ????????????<interceptor-stack name="myInterceptors"> ????????????????<interceptor-ref name="loginInterceptor" /> ????????????????<interceptor-ref name="defaultStack" /> ????????????</interceptor-stack> ????????</interceptors> ????????<!-- 指定新的自定義的攔截器棧為默認(rèn)的攔截器棧,這樣自定義的權(quán)限控制攔截器就可以發(fā)揮作用了 --> ????????<!-- 這里name屬性值對(duì)應(yīng)的是上述interceptor-stack name屬性值 --> ????????<default-interceptor-ref name="myInterceptors"></default-interceptor-ref> ????????? ????????<!-- 這里對(duì)應(yīng)攔截器中return Action.LOGIN對(duì)應(yīng)的頁(yè)面--> ????????<global-results> ????????????<result name="login">/WEB-INF/content/LoginInfo/login.jsp</result> ????????</global-results> ????</package> |
定義注解
注解主要是作用在方法上,攔截器根據(jù)方法是否定義注解來(lái)處理登陸判斷
| 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(); // 獲取類(lèi)對(duì)象 ????????Method currentMethod = clazz.getMethod(methodName); //獲取攔截的方法 ????????? ????????//方法上添加了注解 ????????if (currentMethod.isAnnotationPresent(Authority.class)) { ????????????// 取得當(dāng)前請(qǐng)求的注解的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) // 未登陸,跳轉(zhuǎn)到登錄頁(yè) ????????????{ ????????????????System.err.println("進(jìn)入攔截器:未登陸"); ????????????????context.put("tip", "你還沒(méi)有登錄"); ????????????????return Action.LOGIN; ????????????} else {?? //已登錄,繼續(xù)后續(xù)流程 ????????????????System.err.println("進(jìn)入攔截器:已登錄"); ????????????????return invocation.invoke(); ????????????} ????????} else { ????????????System.err.println("進(jìn)入攔截器:沒(méi)有使用注解"); ????????????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")?? //這里對(duì)應(yīng)的配置文件中包的名稱(chēng) 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("")? //定義注解后未登錄回到登陸頁(yè),否則執(zhí)行后續(xù)步驟 ????public String loginValidate() throws Exception { ????????return SUCCESS; ????} } |
內(nèi)置的注解@InterceptorRefs/@InterceptorRef只能作用在類(lèi)文件上,不能作用到方法上(從其@Target屬性即可看出)
類(lèi)上的注解@ParentPackage("custom-default")必須對(duì)應(yīng)structs.xml中package的name屬性,否則注解不起效
structs.xml中default-interceptor-ref的name值對(duì)應(yīng)的是interceptor-stack的name值,否則注解不起效
?
五、參考資料?
轉(zhuǎn)載于:https://www.cnblogs.com/gossip/p/5195764.html
總結(jié)
以上是生活随笔為你收集整理的Struct2_定义拦截器并使用注解方式作用在Action的方法中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 400字读后感大全30篇
- 下一篇: [LintCode] Simplify