拦截器

需求

如果要访问某一个action类中的某一个方法的内容,如果是admin用户,则访问,如果不是admin用户,则不能访问。

实现

缺点  权限判断的代码和业务逻辑代码混合在一起了

利用拦截器改进

实现

步骤

1、    编写interceptor

return "error"  跳过action  返回strut.xml中 result结果的页面

2、    写一个PvilegeSuperAction

3、    在配置文件中进行配置

详细解析

说明:

通过该图可以看出:当提交一个url请求时,先执行所有的拦截器(按照声明的从上到下的顺序),再执行action。

声明一个拦截器

声明一个拦截器栈

既可以引用一个拦截器

也可以引用一个拦截器栈

  真正的做法:建立一个package只方拦截器 然后其他的package继承这个package

如果p包继承了privilege包就把所有的新的拦截器栈继承过来了,如果没有继承,则执行默认的拦截器栈

拦截器的优点

1、  把项目中一些经常用到的业务逻辑从action中分离出来,写到拦截器中

这样可以做到这些常用的逻辑和真正的逻辑的松耦合

2、  拦截器和action是真正的松耦合了

3、  Struts2把开发过程中的一些常用的业务已经封装到各个拦截器中了

案例2

拦截器的应用

属性驱动

parameter拦截器

利用对象栈的原理

注意事项:

1、  必须使用struts2默认的拦截器栈中的ParametersInterceptor

2、  Action中的属性和表单中的name属性的值保持一致

3、  利用valueStack.setValue方法可以赋值了

如有form表单太多,那么action里的属性变量太多引出模型驱动

模型驱动

1.  模型驱动: 
         模型驱动是使用javaBean对象来封装请求参数,在整个MVC流程中可以直接使用这个对象。在发送请求后Struts将各个请求参数(javab的属性)封装到一个JavaBean对象中,Action接收这个实例对象并用该对象进行相关处理返回处理结果。 
         模型驱动的Action中定义javaBean并实例化,并且需要提供该JavaBean的getter和setter方法。Action需要实现ModelDriven接口。

从上图可以看出,ModelDriverInterceptor有两个作用:

1、  当前请求的action必须实现ModelDriver接口

2、  把model对象放入到了栈顶

格式校验拦截器

validationIntercepter

防止表单重复提交
1、原理
利用了struts2内置的拦截器token实现的
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
2、步骤
1、在要提交的表单页面上,要写一个struts2自定义的标签:
<s:form action="../tokenAction_token.action">
<s:token></s:token>//生成一大堆字符串,用于往session中存放
用户名:<s:textfield name="username"></s:textfield>
密码:<s:password name="password"></s:password>
<s:submit></s:submit>
</s:form>
2、在配置文件中,由于在defaultStack中没有把token包括进来,所以
<interceptors>
<interceptor-stack name="tokenInterceptor">
<interceptor-ref name="token">
//哪些方法可以防止重复提交,如果有很多方法,则用,隔开
<param name="includeMethods">token</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="tokenInterceptor"></default-interceptor-ref>
说明:
1、上面的配置新定义了一个拦截器栈
2、在拦截器栈中把默认的拦截器栈加了进来
<interceptor-ref name="defaultStack"></interceptor-ref>
3、在这个拦截器栈中把token也加了进来,并且指明了哪些方法需要用到防止重复提交
<interceptor-ref name="token">
//哪些方法可以防止重复提交,如果有很多方法,则用,隔开
<param name="includeMethods">token</param>
</interceptor-ref>
4、把新定义的拦截器栈tokenInterceptor成了默认的拦截器栈
3、如果表单重复提交了,将指向invalid.token的错误页面
<result name="invalid.token">token/error.jsp</result>
4、如果只执行了上述的内容,报错信息将是一个英文信息, 变成中文信息,步骤如下:
1、 在struts2的配置文件中,加入自定义资源文件的配置
<constant name="struts.custom.i18n.resources" value="com.itheima.struts2.resource.token"></constant>
说明:引入了一个资源文件:为com/itheima/struts2/resource/token.properties
2、在该资源文件中
struts.messages.invalid.token=\u4E0D\u80FD\u91CD\u590D\u63D0\u4EA4\u8868\u5355
说明:key值保持不变,value是输出的错误信息

10、文件的上传
1、原理:
在struts2中,利用拦截器fileUpload实现了文件上传
2、实现步骤
1、在页面上
<s:form action="uploadAction_upload.action" enctype="multipart/form-data">
<s:file name="resource"></s:file>
<s:submit></s:submit>
</s:form>
说明:enctype="multipart/form-data"是必须的,说明要上传的文件是以二进制流的形式传递的
2、在文件上传的action中,要有一个属性resource,属性的类型为File
public class UploadFileAction{
private File resource;
//set和get方法
}
3、写一个帮助类,可以把resource文件上传到服务器上的某一个地方
4、详情:
1、可以控制文件上传的大小
1、在default.properties文件中,有这样一个配置
struts.multipart.maxSize=2097152
说明文件上传的默认的最大的值为2M
2、如果要改变其默认值,在配置文件中,设置如下的配置
<constant name="struts.multipart.maxSize" value="8097152"></constant>
把文件上传的最大值改为8M
2、可以控制文件的类型和扩展名
1、在action中,可以显示文件的类型和扩展名
1、在action中可以设置如下的属性
resourceContentType 该属性的名称的组成为{name}ContentType
2、在action中可以设置如下的属性
resourceFileName 该属性的名称的组成为{name}FileName

拦截器源码中名字

2、在配置文件中
引入拦截器fileUpload
<interceptor-ref name="defaultStack">
<!--
允许上传的文件的最大size
-->
<param name="fileUpload.maximumSize">8097152</param>
<!--
允许上传文件的扩展名
-->
<param name="fileUpload.allowedExtensions">txt,doc,pdf,jpg</param>
<!--
允许上传文件的类型
-->
<param name="fileUpload.allowedTypes">application/msword</param>
</interceptor-ref>
说明:
1、因为拦截器在默认的栈中,所以只需要引入默认的栈就可以了
2、在这里可以通过param给默认栈的fileUpload拦截器的属性赋值
所以maximumSize,allowedExtensions,allowedTypes都是拦截器fileUpload的属性
3、如果大小、后缀名、扩展名不符合要求,则会报错,系统会跳转到input指向的页面
<result name="input">error.jsp</result>,在error.jsp中编写<s:fielderror></s:fielderror>,就可以看到错误信息
但是,报错的信息是英文的信息,如上传的时候类型错误的信息:
Content-Type not allowed: upload "xwork-2.1.6-src.zip" "upload_6fff0830_13174e12471__8000_00000000.tmp" application/x-zip-compressed
该信息的组成(org.apache.struts2):struts-messages.properties
struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}
{0}:代表页面上<input name="upload" type="file"/>中的name的值
{1}:代表文件上传的名称
{2}:文件保存在临时目录的名称。临时目录为work\Catalina\localhost\struts2
{3}:代表文件上传类型,或者文件上传大小。上面的错误代表文件上传类型。如果报第一个错误,则代表文件上传大小。
怎么样变成中文的信息呢?
步骤:
1、 建立一个properties文件。这个文件的名称可以任意取。
2、 在这个配置文件中,添入如下的内容:
struts.messages.error.file.too.large=文件超过了规定的大小: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=该类型不允许被上传: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=不能上传该扩展名类型的文件: {0} "{1}" "{2}" {3}
3、 在struts-upload.xml中,指定配置文件的位置
<constant name="struts.custom.i18n.resources" value="com.itheima.struts2.action.upload.fileuploadmessage"></constant>
如果配置文件放在src下,则这样指定:
<constant name="struts.custom.i18n.resources" value="fileuploadmessage"></constant>

struts2(三)拦截器的更多相关文章

  1. JavaWeb框架_Struts2_(三)---->Struts2的拦截器

    2. Struts2的拦截器(使用拦截器实现权限控制) 2.1 拦截器的概述 拦截器是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器.Struts ...

  2. struts2总结六: Struts2的拦截器

    一.Struts2的系统结构图

  3. Struts2使用拦截器完成权限控制示例

    http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求:    要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...

  4. Struts2【拦截器】就是这么简单

    什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Str ...

  5. (转)Struts2的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/68648101 Struts2的拦截器 拦截器的概述 拦截器,在AOP(Aspect-Orien ...

  6. 【跟我一步一步学Struts2】——拦截器

    前言 前面提到过拦截器.而且说拦截器仅仅能拦截Action.这里拦截器的调用体现了责任链模式.为什么说体现了责任链模式呢? 以下的一段话说的非常明确: Struts2将整个运行划分成若干同样类型的元素 ...

  7. JavaWeb_(Struts2框架)拦截器interceptor

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  8. (六)Struts2的拦截器

    一.简介 拦截器体系是struts2重要的组成部分.正是大量的内建拦截器完成了该框架的大部分操作. 比如params拦截器将请求参数解析出来,设置Action的属性.servletConfig拦截器负 ...

  9. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

随机推荐

  1. weblogic连接池过小导致TPS呈周期性跳坑现象

    利用晚上时间跑个12小时稳定性,第二天发现TPS曲线图成了这个样子. 排查步骤: 1.观察TPS图发现,几乎每两个小时TPS掉一次坑,是周期性的,而且TPS有掉到0的现象.LR上也有失败的交易,猜想是 ...

  2. JSON转化

    相关链接 : http://blog.csdn.net/gchb9527/article/details/8688279 --------------------------------------- ...

  3. CSS学习笔记-03- 过渡模块之前奏篇 a标签的伪类选择器

    CSS3 2D转换CSS3 3D转换CSS3 过渡CSS3 动画 CSS3 的四大金刚. 想要实现酷炫的视觉效果,上面4个是必须要掌握的.学习之前,先复习一下 视觉盛宴的前菜 :a标签的伪类选择器 铛 ...

  4. JAVA基本类型和包装类

    JAVA的包装类 Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表 ...

  5. 51nod1042

    给出一段区间a-b,统计这个区间内0-9出现的次数.   比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. Inp ...

  6. Oracle学习(四)_SQL函数

    --第一部分:SQL基础 --ch1 简单查询 --ch2 查询基本概念 --ch3 数据过滤 --第二部分:多表操作 --ch4 集合理论 --ch5 内连接 --ch6 外连接 --ch7 子查询 ...

  7. 《uniGUI for cBuilder入门到精通》新书预定

    <uniGUI for cBuilder入门到精通>火热预定中,从零开始带你入瓮带你飞,手把手教你如何快速安装,开发和部署一个web系统,前十名用户售价暂定100元,后续价格每本200元, ...

  8. django面试大全

    1.Django请求的生命周期 a. wsgi, 创建socket服务端,用于接收用户请求并对请求进行初次封装. b. 中间件,对所有请求到来之前,响应之前定制一些操作. c. 路由匹配,在url和视 ...

  9. HDU 6059 17多校3 Kanade's trio(字典树)

    Problem Description Give you an array A[1..n],you need to calculate how many tuples (i,j,k) satisfy ...

  10. 16 多校8 Rikka with Parenthesis II

    As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...