在上篇文章中我们留下了这个问题。在这里我们一点一点的解决。

问题一

由于我们写了自己的拦截器,默认的拦截器不起作用了。

解决办法一

把默认拦截器加入到配置文件中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发者模式 --><constant name="struts.devMode" value="true"></constant><package name="user" extends="struts-default" namespace="/user"><!-- 声明自己定义的拦截器,名字以及对应的java类 --><interceptors> <interceptor name="myInterceptor" class="com.scx.web.intercepter.LoginIntercepter"></interceptor></interceptors><!-- 全局逻辑结果视图 --><global-results><result name="input">/login.jsp</result></global-results><!-- 用户登录的操作方法 --><action name="login" class="com.scx.web.action.UserAction" method="login"><result name="success" type="redirectAction">toMain</result></action><!-- 显示主页的操作方法 --><action name="toMain" class="com.scx.web.action.UserAction" method="main"><!-- 默认拦截器配置进来 --><interceptor-ref name="defaultStack"></interceptor-ref><!-- 自定义拦截器配置进来 --><interceptor-ref name="myInterceptor"></interceptor-ref><result name="success">/main.jsp</result></action><!-- 显示另一个页面的操作方法 --><action name="toOther" class="com.scx.web.action.UserAction" method="other"><!-- 默认拦截器配置进来 --><interceptor-ref name="defaultStack"></interceptor-ref><!-- 自定义拦截器配置进来 --><interceptor-ref name="myInterceptor"></interceptor-ref><result name="success">/other.jsp</result></action></package>
</struts>

问题二

解决方法一中存在的问题:当有多个拦截器,多个action动作时,需要配置的地方太多。

解决办法二

抽取公共的包,把全局配置放入公共包中

每次我们在Struts.xml编写包时都会将其继承于struts-default,这是struts2核心jar包里面为我们提供的。

想去看的同学可以解压Struts2的核心包, 里面有struts-default.xml,打开就能看到,第128行。
这里的继承和javase里面的继承一样,我们当然也可以继承于自己新建的包,有个前提就是,我们新建的包一定要是抽象的,即未配置任何action动作。
一定要仔细看注释,否则可能看不懂。
简而言之就是:

  • 我们新建了一个名为my-default的package 继承于struts-default
  • 我们在my-default包里面配置我们的自定义拦截器栈myDefaultStack,引入自定义的拦截器和系统默认的拦截器栈
  • 在action动作的包继承于my-default。在主页和其它页面的action动作里添加我们自定义的拦截器栈myDefaultStack
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发者模式 --><constant name="struts.devMode" value="true"></constant><package name="my-default" abstract="true" extends="struts-default">    <interceptors> <!-- 声明自己定义的拦截器,名字以及对应的java类 --><interceptor name="myInterceptor" class="com.scx.web.intercepter.LoginIntercepter"></interceptor><!-- 自定义的拦截器栈 --><interceptor-stack name="myDefaultStack"><!-- 配置自己定义的拦截器 --><interceptor-ref name="myInterceptor"></interceptor-ref><!-- 配置默认的拦截器栈 --><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 全局逻辑结果视图 --><global-results><result name="input">/login.jsp</result></global-results></package><!-- 继承于上面的my-default --><package name="user" extends="my-default" namespace="/user"><!-- 用户登录的操作方法 --><action name="login" class="com.scx.web.action.UserAction" method="login"><result name="success" type="redirectAction">toMain</result></action><!-- 显示主页的操作方法 --><action name="toMain" class="com.scx.web.action.UserAction" method="main"><!-- 引入自定义的拦截器栈  name和上面我们自定义的拦截器栈名相对应--><interceptor-ref name="myDefaultStack"></interceptor-ref><result name="success">/main.jsp</result></action><!-- 显示另一个页面的操作方法 --><action name="toOther" class="com.scx.web.action.UserAction" method="other"><!-- 引入自定义的拦截器栈  name和上面我们自定义的拦截器栈名相对应--><interceptor-ref name="myDefaultStack"></interceptor-ref><result name="success">/other.jsp</result></action></package>
</struts>

这样似乎解决了很多拦截器的问题,但是还没解决很多action动作仍然需要配置的问题,到底能不能不配置呢?

问题三

解决方法二还没解决很多action动作仍然需要配置的问题,到底能不能不配置呢?

解决办法三

思路:我们在设置【开发模式】时,覆盖掉了一个default.properties中的常量,能不能把struts-default.xml中的默认拦截器栈的设置给覆盖掉呢?答案是可以的。
同样也是在struts-default.xml中可以找到这行代码

  • 在my-default包里面设置默认的拦截器栈
  • 删除解决方法二action里面配置的自定义拦截器栈

配置后的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发者模式 --><constant name="struts.devMode" value="true"></constant><package name="my-default" abstract="true" extends="struts-default">    <interceptors> <!-- 声明自己定义的拦截器,名字以及对应的java类 --><interceptor name="myInterceptor" class="com.scx.web.intercepter.LoginIntercepter"></interceptor><!-- 自定义的拦截器栈 --><interceptor-stack name="myDefaultStack"><!-- 配置自己定义的拦截器 --><interceptor-ref name="myInterceptor"></interceptor-ref><!-- 配置默认的拦截器栈 --><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 设置默认拦截器 --><default-interceptor-ref name="myDefaultStack"/><!-- 全局逻辑结果视图 --><global-results><result name="input">/login.jsp</result></global-results></package><!-- 继承于上面的my-default --><package name="user" extends="my-default" namespace="/user"><!-- 用户登录的操作方法 --><action name="login" class="com.scx.web.action.UserAction" method="login"><result name="success" type="redirectAction">toMain</result></action><!-- 显示主页的操作方法 --><action name="toMain" class="com.scx.web.action.UserAction" method="main"><result name="success">/main.jsp</result></action><!-- 显示另一个页面的操作方法 --><action name="toOther" class="com.scx.web.action.UserAction" method="other"><result name="success">/other.jsp</result></action></package>
</struts>

这样配置 似乎我们完成了我们的目标,无论有多少个自定义拦截器都可以配置到my-default包里面,无论都多少个action只要它继承于my-default就可以。可是你有没有发现,这样连我们的登录页面也被拦截了。
问题真是一个接着一个出现 。累觉不爱啊

问题四

解决方法三把我们的登录界面都被拦截了

解决办法四

需要通过AbstractInterceptor类的子类入手,通过查看发现,该类还有一个子类是抽象的

  • excludeMethods配置哪些动作方法不拦截
  • includeMethods配置那些动作方法拦截
    我们都可以在struts.xml中通过注入的方式进行配置。根据自己的需求为不同的参数注入。

所以我们在自定义拦截器时,还可以继承MethodFilterInterceptor并且重写doIntercept方法。

在struts.xml配置的部分代码如下

运行似乎没有问题。
还是有个问题 不知道大家有没有发现
我们是在my-default里面配置哪些方法需要拦截,哪些方法不需要拦截。但是在没有写动作类和动作方法之前,不确定方法名叫什么。

问题五

我们在声明时配置了哪些方法需要拦截,哪些方法不需要拦截。但是在没有写动作类和动作方法之前,不确定方法名叫什么。

解决办法五

我们可以在需要使用拦截器的时候给它注入参数。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发者模式 --><constant name="struts.devMode" value="true"></constant><package name="my-default" abstract="true" extends="struts-default">    <interceptors> <!-- 声明自己定义的拦截器,名字以及对应的java类 --><interceptor name="myInterceptor" class="com.scx.web.intercepter.LoginIntercepter"></interceptor><!-- 自定义的拦截器栈 --><interceptor-stack name="myDefaultStack"><!-- 配置自己定义的拦截器 --><interceptor-ref name="myInterceptor"></interceptor-ref><!-- 配置默认的拦截器栈 --><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 设置默认拦截器 --><default-interceptor-ref name="myDefaultStack"/><!-- 全局逻辑结果视图 --><global-results><result name="input">/login.jsp</result></global-results></package><!-- 继承于上面的my-default --><package name="user" extends="my-default" namespace="/user"><!-- 用户登录的操作方法 --><action name="login" class="com.scx.web.action.UserAction" method="login"><interceptor-ref name="myDefaultStack"><!-- 在使用拦截器时给拦截器注入参数 --><param name="myInteceptor.excludeMethods">login</param></interceptor-ref><result name="success" type="redirectAction">toMain</result></action><!-- 显示主页的操作方法 --><action name="toMain" class="com.scx.web.action.UserAction" method="main"><result name="success">/main.jsp</result></action><!-- 显示另一个页面的操作方法 --><action name="toOther" class="com.scx.web.action.UserAction" method="other"><result name="success">/other.jsp</result></action></package>
</struts>

到此全部结束。。

解决自定义拦截器导致默认的拦截器不起作用的问题相关推荐

  1. Android默认音乐,控制Android或任何其他音乐播放器的默认音乐播放器

    AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); if(mAudioManage ...

  2. 使用struts2中默认的拦截器以及自定义拦截器

    转自:http://blog.sina.com.cn/s/blog_82f01d350101echs.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Acti ...

  3. Jodd 5.0 使用自定义WebApp及设置默认拦截器

    首先使用IDEA创建Java工程,目录如下图所示: 使用 Jetty作为Web服务器,配置 jetty.xml: <?xml version="1.0" encoding=& ...

  4. 自定义拦截器和提供的拦截器

    在访问struts2中某个action之后或者之前,会自动调用的类,就是struts2中的拦截器 一,怎样自定义拦截器 自定义一个拦截器需要三步: 1 ,自定义一个实现Interceptor接口(或者 ...

  5. struts2自定义拦截器(登陆校验拦截器)

    需求:有些页面需要先登录才可以访问,如果没有登陆就跳转到login.jsp去登陆 此案例为访问login方法的时候不拦截,只有把user放到session中才可以访问别的方法 web.xml 配置拦截 ...

  6. ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器。用springframework自带的便可...

    ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器.用springframework自带的便可 转载于:https://www.cnblogs.com/oymx/p/3976392. ...

  7. SpringBoot重写拦截器导致无法接收Put请求表单参数

    有个项目,由于架构问题,开始没有重写拦截器,而在接口写了一大部分的时候(api是rest风格,主要使用get,post,put,delete,patch方法),发现有些功能需要在拦截器统一配置,于是才 ...

  8. spring 两次进入拦截器_过滤器和拦截器的 6 个区别,别再傻傻分不清了

    点击上方 肉眼品世界,选择 设为星标 深度价值体系传递 作者 :程序员内点事 来源 :toutiao.com/i6834310440495874563 毕竟这两种工具开发中用到的频率都相当高,应用起来 ...

  9. SpringBoot 整合JWT实现基于自定义注解的-登录请求验证拦截(保姆级教学,附:源码)

    学习目标: Spring Boot 整合JWT实现基于自定义注解的 登录请求接口拦截 例: 一篇掌握 JWT 入门知识  1.1 在学习SpringBoot 整合JWT之前,我们先来说说JWT进行用户 ...

最新文章

  1. html选择字段至左边的列表,css – 如何将列表项显示为保留从左到右顺序的列?...
  2. 搜狗拼音输入法5.0_如何用搜狗拼音输入法输入生僻字?
  3. linux mint开启热点,Linux Mint 17 + 小米WIFI创建手机热点
  4. 【C/C++语言入门篇】-- 文件操作
  5. 九度OJ 1054:字符串内排序
  6. 修改PATH导致fedora无法登录XWindow
  7. shell脚本的一些用法笔记
  8. π-Algorithmist分类题目(1)
  9. 【翻转整数考虑溢出】LeetCode 7. Reverse Integer
  10. MyBatis学习前篇
  11. Head First Java 目录结构
  12. 【眼底图像数据集】视杯 视盘分割
  13. 中文编程入门(Lua5.4中文版)第一个 Lua 程序,世界,你好!
  14. mysql按升序创建索引_MySQL 降序索引 (Descending Indexes)
  15. vue+element UI分页的使用方法
  16. HTML5 开发工具
  17. 人工智能3d建模算法_AI人工智能是否可以替代UI和后期3D建模?
  18. Keras: 创建多个输入以及混合数据输入的神经网络模型
  19. 知识图谱(六):图数据库neo4j内部结构理解
  20. 全球与中国IC托盘行业调查与未来发展趋势研究报告

热门文章

  1. 手绘图分析(Sketch Analysis)
  2. 常见 markdown 数据符号操作
  3. cell-blog 功能介绍与安装
  4. Microsoft Excel 直方图
  5. 月销售额224万美金的Shopify独立站卖家实操详解
  6. ICIP2020:VVC解码端基于GPU的运动补偿优化
  7. 离散数学——第三章 关系
  8. 在数据表中添加一个字段的SQL语句怎么写
  9. 在VMware中如何安装vista
  10. Caffe 代码解读之 softmax layer