一、目的:通过在方法上加注解控制哪些方法需要登陆后才能访问

 
二、方式:利用拦截器判断用户是否登陆
 
三、实现步骤
  1. 定义配置文件
    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>
  2. 定义注解

    注解主要是作用在方法上,拦截器根据方法是否定义注解来处理登陆判断

    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();
    }
  3. 定义拦截器

    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();
            }
        }
    }
  4. 定义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;
    }
}
 
四、实现过程中遇到的坑
  1. 内置的注解@InterceptorRefs/@InterceptorRef只能作用在类文件上,不能作用到方法上(从其@Target属性即可看出)

  2. 类上的注解@ParentPackage("custom-default")必须对应structs.xml中package的name属性,否则注解不起效

  3. structs.xml中default-interceptor-ref的name值对应的是interceptor-stack的name值,否则注解不起效

 

五、参考资料

Struct2_定义拦截器并使用注解方式作用在Action的方法中的更多相关文章

  1. springmvc自己定义拦截器

    Spring MVC也能够使用拦截器对请求进行拦截处理,用户能够自己定义拦截器来实现特定的功能,自己定义的拦截器必须实现HandlerInterceptor接口. 直接看下样例: package co ...

  2. struts自己定义拦截器--登录权限控制

    说明:该自己定义的拦截器实现用户登录的权限控制. login.jsp--->LoginAction--重定向-->MainAction--->main.jsp 一.1.整体的步骤: ...

  3. struts2学习笔记(5)---自己定义拦截器

    什么是拦截器? struts2中拦截器分为Struts2定义好的拦截器和自己定义的拦截器. 其作用是在一个Action运行之前进行拦截,在Action运行之后又增加某些操作. 实现原理 当请求一个Ac ...

  4. Struts2通过自己定义拦截器实现登录之后跳转到原页面

    这个功能对用户体验来说是非常重要的.实现起来事实上非常easy. 拦截器的代码例如以下: package go.derek.advice; import go.derek.entity.User; i ...

  5. jquery.ajax与axios及定义拦截器

    首先导入jquery和axios包 jquery.ajax function reg(){ var username = $("#username").val(); var pas ...

  6. Struts2_day04--自定义拦截器_Struts2的标签库_表单标签

    自定义拦截器 1 在struts2里面有很多的拦截器,这些拦截器是struts2封装的功能,但是在实际开发中,struts2里面的拦截器中可能没有要使用的功能,这个时候需要自己写拦截器实现功能 2 拦 ...

  7. CXF实战之自己定义拦截器(五)

    CXF已经内置了一些拦截器,这些拦截器大部分默认加入到拦截器链中,有些拦截器也能够手动加入,如手动加入CXF提供的日志拦截器.也能够自己定义拦截器.CXF中实现自己定义拦截器非常easy.仅仅要继承A ...

  8. struts2拦截器加自定义注解实现权限控制

    https://blog.csdn.net/paul342/article/details/51436565 今天结合Java的Annotation和Struts2进行注解拦截器权限控制. 功能需求: ...

  9. Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器

    上一篇<更加简练的编程体验>提供了最新版本的Dora.Interception代码的AOP编程体验,接下来我们会这AOP框架的编程模式进行详细介绍,本篇文章着重关注的是拦截器的定义.采用“ ...

随机推荐

  1. 【UOJ#169】元旦老人与数列

    论文题. 考虑到这题的维护和区间操作是反向的,也就是说无法像V那题快速的合并标记. 我们知道,一个区间的最小值和其他值是可以分开来维护的,因为如果一个区间被整体覆盖,那么最小值始终是最小值. 对于被覆 ...

  2. MySQL的读写分离---主从复制、主主复制

    1.复制是基于BinLog日志 存在三种日志格式:Statement:存储Sql语句,存储日志量是最小的.有可能复制不一致Row:存储event数据,存储日志量大,但是不能很直接进行读取:Mixed: ...

  3. 关于大O法的几点解释

    大O表示法指出算法有多快.例如,假设列表包含n个元素.简单查找需要检查每个元素,因此需要执行n次操作.使用大O表示法,这个运行时间为O(n).主要单位不是秒啊,大O表示法值得并非以秒为单位的速度,而是 ...

  4. 【python】msgpack使用

    1.存储数据 import msgpack var={'a':'this','b':'is','c':'a test'} with open('file.name','wb') as f: msgpa ...

  5. 【转载】JAVA多线程和并发基础面试问答

    转载自这里. 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注: ...

  6. 数据库之存储过程(Stored Procedure)【未完待续】

    存储过程(Stored Procedure,以下简称SP)是啥?有什么用?优缺点? 一个SP是一段存储在数据库系统中的一条或多条sql语句的集合,类似一条批处理,它能被触发器,或者其他的SP以及APP ...

  7. JAVA 语言类的特性(成员、重载、构造方法、静态成员)

    一.类的私有成员和公有成员 1.私有成员 修饰符private    如果在类的声明前加上修饰符private,则无法从该类的外部访问到该类的内部成员,而只能被该类自身访问和修改,而不嗯那个被其他类, ...

  8. 【JBPM4】任务form表单

    主要是在任务节点处保存一个链接地址(表单),方便在执行到此时取值,访问. 好处是XML可随时修改,部署. JPDL <?xml version="1.0" encoding= ...

  9. iis频繁奔溃,求大神帮忙分析dump

    直接上图了 上图三个错误最近频繁出现,出现一次iis就奔溃一次,抓取的dump分析后如下: Couldn't resolve error at 'ls' :> !analyze -v ***** ...

  10. Appscan的第一个测试请求就是提交MAC地址

    GET /AppScan_fingerprint/MAC_ADDRESS_真实的MAC地址.html HTTP/1.0 还好都是合法测试,否则情何以堪...