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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSDP协议_固态硬盘两种协议

    SSDP协议_固态硬盘两种协议SSDP,即简单服务发现协议(SSDP,SimpleServiceDiscoveryProtocol),是一种应用层协议,是构成通用即插即用(UPnP)技术的核心协议之一。 实现简单服务发现协议是在HTTPU和HTTPMU的基础上实现的协议。按照协议的规定,当一个控制点(客户端)接入网络的时候,它可以向一个特定的多播地址的SSDP端口使用M-SEARCH方法发送“ssdp:…

    2022年10月11日
    2
  • android脚本工具,安卓脚本编程软件[通俗易懂]

    android脚本工具,安卓脚本编程软件[通俗易懂]脚本编程助手是一款实用的脚本编程软件,对脚本程序感兴趣的朋友可以试试,内置多种辅助和工具,支持基础操作类、多功能操作类,基础辅助类和http类等等,为你写好更经典的脚本程序提供强大支持,有需要的朋友欢迎体验。软件相关脚本(Script)是一种批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等。简介脚本简单…

    2022年5月23日
    34
  • 【移动端】手机界面的设计尺寸

    【移动端】手机界面的设计尺寸从设计方面来看,做手机界面设计的尺寸一般分为iPhone和Android两种设备。iPhone的分辨率设备 逻辑分辨率(point)(pt) 物理分辨率(pixel)(px) 屏幕尺寸 缩放因子(scale) 像素密度PPI 比例(近似) iPhone2G/3/3GS 320×480 320×480 3.5寸 @1x 163 2:3 iPhone4/4S 320×480 640..

    2022年6月21日
    26
  • (翻译)什么是Java的永久代(PermGen)内存泄漏

    (翻译)什么是Java的永久代(PermGen)内存泄漏转自:http://www.codelast.com/本文是我对这篇文章的翻译:WhatisaPermGenleak? 为了便于阅读,我将原文附于此处,翻译穿插在其中。此外,为了防止原链接在未来某一天失效后,文中的图片再也看不到的问题,我将原文中的图片也保存到了本站的服务器上,我不知道原作者是否允许这样做,但我翻译本文仅在于传播知识的目的,在此向原作者表示深深的感谢:感谢你

    2022年6月29日
    35
  • 什么是EDR!

    什么是EDR!一、端点检测与响应端点:台式机、服务器、移动设备和嵌人式设备等。攻击者往往首先利用目标网络中的脆弱端点建立桥头堡,再通过进一步的漏洞利用来构筑长期驻留条件,最终迈向既定目标。端点检测与响应((EndpointDetectionandResponse,EDR):完全不同于以往的端点被动防护思路,而是通过云端威胁情报、机器学习、异常行为分析、攻击指示器等方式,主动发现来自外部或内部的安全威胁…

    2022年6月2日
    200

发表回复

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

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