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


相关推荐

  • Python表白代码:太秀了,用过的人都找到了对象…【满屏玫瑰盛开】

    Python表白代码:太秀了,用过的人都找到了对象…【满屏玫瑰盛开】导语暗恋让人受尽委屈!一开始,你是我的秘密,我怕你知道,又怕你不知道,又怕你知道装作不知道!这大概就是暗恋的感受吧,可若是双向奔赴,那简更是甜蜜度爆表,快同小编吃下这波狗粮!跟着上一期的玫瑰花花样表白之后,小编新出了2款新型升级之后的表白代码!花样表白总有一款是你喜欢的!效果满分~正文还是熟悉的配方!熟悉的味道!盛开的蓝玫瑰效果如下:附源码:t.setup(800,800)t.hideturtle()t.speed(11)t.penup().

    2022年5月5日
    98
  • 实时车辆行人多目标检测与跟踪系统-上篇(UI界面清新版,Python代码)

    实时车辆行人多目标检测与跟踪系统-上篇(UI界面清新版,Python代码)摘要:本文详细介绍如何利用深度学习中的YOLO及SORT算法实现车辆、行人等多目标的实时检测和跟踪,并利用PyQt5设计了清新简约的系统UI界面,在界面中既可选择自己的视频、图片文件进行检测跟踪,也可以通过电脑自带的摄像头进行实时处理,可选择训练好的YOLOv3/v4等模型参数。该系统界面优美、检测精度高,功能强大,设计有多目标实时检测、跟踪、计数功能,可自由选择感兴趣的跟踪目标。博文提供了完整的Python程序代码和使用教程,适合新入门的朋友参考,完整代码资源文件请转至文末的下载链接。

    2022年10月13日
    4
  • 解决vscode中文乱码的代码_vscode终端

    解决vscode中文乱码的代码_vscode终端我们现在很多编程开放工作中,VSCode已经成了一款难以绕过去的轻量级完善好用的代码编辑器。功能完善兼容性好体验不错,受到越来越多的开发者的认可。所以涉及到编程工作,VScode的安装是个必备的准备工作。我们本文就介绍下Windows和Ubuntu这样的Linux两个操作系统下安装VScode编辑器并解决打开代码文件的时候其中中文显示乱码的问题。当然Windows版本的VScode安装很简单,我们…

    2025年11月30日
    5
  • java从入门到精通_学习Java最好的10本书,从入门到精通

    java从入门到精通_学习Java最好的10本书,从入门到精通在当代,学习Java等编程课程的主要方式是视频资源。如果你想学,在网上五分钟之内就可以找到一堆学习视频,瞬间将你的硬盘填满。但是这些课程质量良莠不齐,对于小白来说,的确让人头痛不已。但是,书籍不同。对于书籍而言,它们都是出自业内大牛和资深的大学教授的精心编写,内容好坏与否,有很多同领域的网友都能帮你把关。所以说,如果你选对了学习的书籍,就可以不用担心自己在编程中,埋下错误的种子,同时还可以更深入的…

    2022年7月8日
    16
  • Apache配置详解(最好的APACHE配置教程)

    Apache配置详解(最好的APACHE配置教程)Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改。主站点的配置(基本配置)(1)基本配置:ServerRoot”/mnt/software/apache2″#你的apache软件安装的位置。其它指定的目录如果没有指定绝对路径,则目录是相对于该目录。PidFilelogs/httpd.pid#第一个httpd进程(所有其他进程的父

    2022年7月14日
    20
  • 什么是 CGI,什么是 IIS,什么是VPS「建议收藏」

    什么是 CGI,什么是 IIS,什么是VPS

    2022年1月17日
    47

发表回复

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

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