struts2拦截器和aop拦截器_自定义拦截器

struts2拦截器和aop拦截器_自定义拦截器拦截器拦截器Filter是Struts2的核心。Struts2的拦截器与Servlet中的过滤器相似。在执行Action的execute()方法之前,Struts2先执行struts.xml中引用的拦截器,在执行完所有引用的拦载器的doIntercept()方法后,会执行Action的execute()方法。在Struts2的拦截器体系中,Struts2的内建拦截器完成了该框架的大部分操作,…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

拦截器

拦截器Filter是Struts2的核心。

Struts2的拦截器与Servlet中的过滤器相似。
在执行Action的execute()方法之前,Struts2先执行struts.xml中引用的拦截器,在执行完所有引用的拦载器的doIntercept()方法后,会执行Action的execute()方法。在Struts2的拦截器体系中,Struts2的内建拦截器完成了该框架的大部分操作,所以在实际的开发过程中通常是使用系统的拦截器。

在这里插入图片描述
拦截器的实现原理

Struts2拦截器的实现原理相对简单,当请求Action时,Struts2会查找配置文件(struts.xml),并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。
比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源;否则,系统直接转入登陆页面。对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用。因为大部分Action里的权限检查代码都大同小异,故将这些权限检查的逻辑放在拦截器中进行将会更加优雅。

拦截器什么时候执行?

在Action类对象创建之后,execute()方法调用之前之后执行(响应到客户端之前)。

拦截器的分类
系统拦截器(默认拦截器)
自定义拦截器
当系统拦截器满足不了需求,就要自定义拦截器.

系统拦截器
系统拦截器有很多,这里重点讲解:Timer和Token
struts-default.xml中intercept有很多系统拦截器

Timer 时间拦截器
作用:测试方法执行所耗的时间。

<action name="person" class="com.zking.action.PersonAction">
    <result>/success.jsp</result>
    <!--系统时间拦截器-->
    <interceptor-ref name="timer"></interceptor>
    <!--系统拦截器栈,使用拦载器一定要带这个栈才生效,这是个好习惯-->
    <interceptor-ref name="defaultStack"/>
</action>

说明:
当访问PersonAction类里所有方法之前,都会触发Timer拦截器,该拦截器显示方法执行消耗时间秒。
运行后发现并没有显示什么时间,原因是2.3缺少了commons-logging-1.1.jar日志包或log4j2日志包,项目中加入该包后再测试。

Token令牌拦截器

作用:解决表单重复提交问题。
办法一:重定向,不让地址栏出现action地址。(这里不再描述)
办法二:令牌,进Action要令牌(当天的火车票,进站时、出站时用,再想进站就要有新的票了)

令牌具体实现步骤:
(1)在表单中使用<s:token>会随机产生的一个字符串,隐藏的文本域。

<form action="" method="post">
    <s:token></s:token>
    ……
</form>

运行JSP页面后,会随机产生一个字符串的token:
在这里插入图片描述
第二步:在struts.xml中配置令牌的拦截器

<action name="person*" class="com.action.PersonAction">
<result>/success.jsp</result>
<!--令牌拦截器-->
<interceptor-ref name="token">
<!--这里可以配置token拦截器的排队方法-->
<!-- param name="excludeMethods">...</param -->
</interceptor>
<!-- 当出现重复提交时,自动跳转到error.jsp -->
<result name="invalid.token">/error.jsp</result>
<interceptor-ref name="defaultStack" />
</action>

可在error.jsp页面中添加<s:actionerror>显示重复提交信息。

自定义拦截器
(1)创建拦截器类
继承MethodFilterInterceptor类,并重写doIntercept方法,在方法中写业务逻辑。

public class MyInterceptor extends MethodFilterInterceptor {

//ActionInvocation为当前Action的运行状态
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
ActionContext ac = invocation.getInvocationContext();
//获得session  
Map session = ac.getSession();
User user = (User)session.get("user");
if(null==user){
   return “login”;
}
//通过放行
invocation.invoke();
return "usreMain";
}
}

先在拦截器doIntercept()方法中获取parameters对象:

Map paramMap = invocation.getInvocationContext().getParameters();

然后用parameters对象获取参数(是一个字符串数组):

String[] names = (String[])paramMap.get("user.userName");
String username = names[0];

配置拦截器

<struts>
<package name="mypack" extends="struts-default" namespace=”/admin”>
    <!--1. 声明自定义拦截器-->
<interceptors>
<interceptor name="loginInterceptor" class="com.zking.interceptor.MyInterceptor">
</interceptor>
</interceptors>

<action name="login" class="com.zking.LoginAction">
    <result name="success">success.jsp</result>
    <!--2. Action中引用自定义拦截器-->
    <interceptor-ref name="loginInterceptor"></interceptor-ref>
    <interceptor-ref name="defaultStack" />
</action>
</package>
</struts>

配置Action中某些方法执行时,不进行拦截:

<interceptor-ref name="loginInterceptor">
    <!-- 忽略login、add方法 -->
    <param name="excludeMethods">login,add</param>
</interceptor-ref>

案例:
我们尝试编写一个Session过滤用的拦截器,该拦截器查看用户Session中是否存在特定的属性(LOGIN属性)如果不存在,中止后续操作定位到LOGIN,否则执行原定操作,代码为:

public class CheckLoginInterceptor extends AbstractInterceptor {
    public static final String LOGIN_KEY = "LOGIN";
    public static final String LOGIN_PAGE = "global.login";
 
    public String intercept(ActionInvocation actionInvocation) throws Exception {
 
        //获得Action对象
        Object action = actionInvocation.getAction();
         //对LoginAction不做该项拦截
        if (action instanceof LoginAction) {
            return actionInvocation.invoke();
        }
 
        // 确认Session中是否存在LOGIN
        Map session = actionInvocation.getInvocationContext().getSession();

        String login = (String) session.get(LOGIN_KEY);
        if (login != null && login.length() > 0) {
            // 存在的情况下进行后续操作
            return actionInvocation.invoke();
        } else {
            // 否则终止后续操作,返回LOGIN
            System.out.println("请登录");
            return LOGIN_PAGE;
        }
    }
}

注册拦截器:

<interceptors>
    <interceptor name="login" class="com.zking.util.CheckLoginInterceptor"/>
    <interceptor-stack name="teamwareStack">
        <interceptor-ref name="login"/>
        <interceptor-ref name="defaultStack"/>
    </interceptor-stack>
</interceptors>

将上述拦截器设定为默认拦截器:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189004.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2017年java培训机构排名[通俗易懂]

    2017年java培训机构排名[通俗易懂]俗话说360行,行行转IT,在如今这个互联网横行的时代,做一个Java开发工程师可以算得上是集智慧,钞票为一身的光鲜职业了,尤其是在北上广这一线城市,年薪30w的黄金小鲜肉随处可见,这也是许多高校毕业生,甚至是其它行业工作数年后都望尘莫及的。因为梦想高薪,跨专业,转行的人比比皆是,也就免不了和一些Java培训机构打交道,而如今这世道教育机构也不见得都那么有“良心”就拿北京来说吧,大大小小的Java培训机构不下5000家,这里边有正规做良心教育的,也有浑水摸鱼什么都不是的,有面向全国招生的,也有面向全国“诈骗

    2022年10月4日
    3
  • Android studio的gradle教程整理「建议收藏」

    Android studio的gradle教程整理「建议收藏」【Gradle教程】第一章:引言http://ask.android-studio.org/?/article/7【Gradle教程】第二章:概述http://ask.android-studio.org/?/article/6【Gradle教程】第三章:教程http://ask.android-studio.org/?/article/15【Gradle教程】第四章:安装…

    2022年6月28日
    28
  • oracle用户修改密码权限_oracle提示表或视图不存在

    oracle用户修改密码权限_oracle提示表或视图不存在今天想要修改一个用户的密码,但是在执行完alteruser语句后,提示用户不存在。查看dba_users视图后,该用户的确是存在的,但是注意到一个细节是用户名是小写的,其他的用户名都是大写。在群内咨询过大神后,原来是在创建用户时,把用户名用双引号包起来了,如果没有用双引号,数据库会自动将用户名改为大写,但是用了双引号后,则保持小写。解决方法为,若创建过程用引号包起来,则在后续的使用过程中,也需要

    2022年7月28日
    4
  • requests请求时,遇到的Accept-Encoding问题

    requests请求时,遇到的Accept-Encoding问题在使用requests请求链接的时候,发现请求得到的内容总是一堆乱码:此时请求的headers里的Accept-Encoding是这样写的:headers={‘Accept-Encoding’:’gzip,deflate’,’User-Agent’:str(‘Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:81.0)Gecko/20100101Firefox/81.0’)}查看目标

    2022年7月15日
    30
  • Installous4 PC Client「建议收藏」

    Installous4 PC Client「建议收藏」Installous4PCClient下载程序请点这里写了一个IPhone上Installous4的PC端可以在电脑上搜索App以后再不用在手机上挂WIFI着下载了…哈哈哈相信越狱的同学

    2022年7月3日
    27
  • 移动机器人轮式里程计

    移动机器人轮式里程计移动机器人灵魂三问:我在哪?我要去哪里?怎么去?其中,第一问对应机器人定位问题。定位问题可阐述为:移动机器人根据自身状态、传感器信息实时确定自己在世界(全局或局部)中的位置与姿态。阿克曼转向的无人驾驶汽车的定位方案主要有:轮式里程计、视觉里程计、激光里程计、惯性导航模块(IMU+GPS)以及多传感器融合。轮式里程计是一种最简单,获取成本最低的方法。与其它定位方案一样,轮式里程计也需要传感器感知外部信息,只不过,轮式里程计采用的电机转速测量模块是一种成本非常低廉的传感器。本文对搭建智能小车系统过程.

    2022年6月15日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号