struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

简介:  理解       Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起组成一个栈.
  •  理解  

    Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起组成一个栈.

    拦截器是一种AOP(面向切面编程)思想的编程方式.它提供一种机制是开发者能够把相对独立的代码抽离出来,配置到Action前后执行.

    Struts2拦截器,每个拦截器只有一个对象实例,属于单例模式,struts2核心功能都是通过拦截器来实现的.

  •  作用

    对action的一些公共处理代码可以放到拦截器中实现,比如权限控制,日志.

  •  执行流程

                  

 

  • 实现步骤

  1.   编写拦截器(实现interceptor接口或继承AbstractInterceptor抽象类即可, )
  2.   在struts.xml中配置拦截器
  3.   在action中使用拦截器

下面写一个自定义拦截器的例子,判断用户是否登录,就是检查当前用户的session中的user属性是否为空,如果为空,就跳到登录页面,否则,继续执行.

  1.编写拦截器,在interceptor包下常见一个java类,名为LoginInterceptor,继承AbstractInterceptor:

public class LoginInterceptor extends AbstractInterceptor{

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {

        //得到拦截到的action的名称,看是否是login,当是login的时候,不用进行下面的检测了,直接执行下一个拦截器
        String actionName=invocation.getProxy().getActionName();
        if("login".equals(actionName)){
            return invocation.invoke();
                    
        }
        //如果不是login.则判断是否已登录,及检测session中key为user的值是否存在,如果不存在,跳回到登录页面
        String user=(String)invocation.getInvocationContext().getSession().get("user");
        if(user==null){
            System.out.println("未登录");
            return "login";
        }
        //进行到这里.说明用户已登录,则跳转到下一个拦截器
        return invocation.invoke();
    }

}

2,在struts.xml中配置interceptor,主要特别注意的是,当使用了自定义的拦截器后,默认拦截器将不起作用,默认拦截器实在struts-default.xml中配置的,当引用了自定义拦截器,又想使用struts2提供的默认拦截器功能,需要手动配置:这里我将默认拦截器和我写的进行登录权限验证的拦截器,写到一个拦截器栈里,然后调用这个默认拦截器栈:

<package name="default" namespace="/" extends="struts-default">
    
     <interceptors>
    <!-- 配置自定义的拦截器-->
          <interceptor name="checkLogin" class="com.wang.interceptor.LoginInterceptor"/>
    <!--配置一个拦截器栈,里面包含自己定义的拦截器和defaultStack默认拦截器-->            
      <interceptor-stack name="myStack">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="checkLogin"></interceptor-ref>
          </interceptor-stack>
     </interceptors>
    <!--引用默认的拦截器(栈)-->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>
        
    <!--配置一个全局结果集-->
     <global-results> <result name="login">/login.jsp</result> </global-results> <action name="login" class="com.wang.action.LoginAction" > <result>/succ.jsp</result> <result name="error">/login.jsp</result> </action> </package>

 

这里我使用了默认拦截器标签,即相当于在每个action标签下,使用了 <interceptor-ref name="myStack"></interceptor-ref>.jsp页面和LoginAction类这里就省略了.

再来介绍一下方法拦截器,方法拦截器比action拦截器控制的更加精细,大体实现方式和action拦截器相同,不同的是它继承的是MethodFilterInterceptor类,重写的是doInterceptor()方法,在struts.xml的配置上也有些不同,大体是这样:

 <interceptor-ref name="methodInterceptor">
           <!--配置被拦截的方法-->
           <param name="includeMethods">methodA,methodsB</param> 
        <!--配置不被拦截的方法-->
<param name="excludeMethods">methodsC,methodsD</param>
 </interceptor-ref>

 

相关文章
|
8月前
|
JSON 安全 搜索推荐
​SpringSecurity-5-自定义登录验证
​SpringSecurity-5-自定义登录验证
95 0
|
存储 前端开发 Java
Java Web实战 | 拦截器案例:用户登录权限验证
在配置文件中如果只定义了一个拦截器,程序首先执行拦截器类中的preHandle()方法。如果preHandle()方法返回false,则中断后续所有代码的执行。如果该方法返回true,程序将继续执行处理器以处理请求。当处理器执行过程中没有出现异常时,会执行拦截器中的postHandle()方法。postHandle()方法执行后会通过相关资源向客户端返回响应,并执行拦截器的afterCompletion()方法;如果处理器执行过程中出现异常,将跳过拦截器中的postHandle()方法,直接由前端控制器渲染异常页面返回响应,最后执行拦截器中的afterCompletion()方法。
173 0
SpringMVC自定义注解验证登陆拦截
这里业务场景需要,所有的请求都需要登录验证。个别通用业务不需要登录拦截。注解方式替代原有的if判断。
SpringMVC自定义注解验证登陆拦截
|
XML 数据格式
javaweb Filter实现权限拦截
javaweb Filter实现权限拦截
【JavaWeb】简易权限校验、Filter-程序跳转
本期主要介绍简易权限校验、Filter-程序跳转
71 0
【JavaWeb】简易权限校验、Filter-程序跳转
|
安全 Java 程序员
项目中的shiro版本从1.6.0改为1.8.0之后,拦截器不生效?
由于前段时间,我们的服务器被阿里云检测到现在使用的shiro版本有漏洞,项目经理让提高版本。遂把shiro的版本改为了1.8.0,改完之后,竟然发现,项目中配置的登录拦截路径不生效了,任何请求都可以通过。我一度以为这是shiro 1.8版本的一个漏洞。但是作为程序员的我,需要找到到底是什么原因,哪里他们哪里出现了bug(说不定还可以给官方提供建议,手动狗头)。于是,我开始研究shiro底层代码。
899 0
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)上
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)
131 0
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)上
|
Java 数据安全/隐私保护 容器
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)下
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)
144 0
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)下
|
存储 缓存 安全
01 还在手写filter进行权限校验?尝试一下Shiro吧
01 还在手写filter进行权限校验?尝试一下Shiro吧
121 0
01 还在手写filter进行权限校验?尝试一下Shiro吧
shiro加入拦截器注意事项
shiro加入拦截器注意事项
109 0
shiro加入拦截器注意事项