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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

    ?

  • 定義Action類及方法
  • 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值,否則注解不起效

  • ?

    五、參考資料
  • 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

    ?





  • 轉載于:https://www.cnblogs.com/gossip/p/5195764.html

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。