日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Struct2_定义拦截器并使用注解方式作用在Action的方法中

發(fā)布時(shí)間:2023/12/31 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(); ????????} ????} }

    ?

  • 定義Action類(lèi)及方法
  • 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; ????} }
    ? 四、實(shí)現(xiàn)過(guò)程中遇到的坑
  • 內(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值,否則注解不起效

  • ?

    五、參考資料
  • http://coolfire9201207034819.iteye.com/blog/1583802
  • http://www.codes51.com/article/detail_120593.html
  • http://www.cnblogs.com/linjiqin/archive/2013/06/21/3148129.html
  • http://blog.csdn.net/z69183787/article/details/38440421
  • http://blog.csdn.net/linchunhua/article/details/8494822

    ?





  • 轉(zhuǎn)載于:https://www.cnblogs.com/gossip/p/5195764.html

    總結(jié)

    以上是生活随笔為你收集整理的Struct2_定义拦截器并使用注解方式作用在Action的方法中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。