拦截器

需求

如果要访问某一个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. linux:NFS

    1.简介 2.安装 安装分为服务端和客户端 [1]我们先拿一台机做服务端 yum install nfs-utils rpcbind -y 然后我们查查看安装没有,查询一个包是否被安装# rpm -q ...

  2. ActiveMQ的P2P示例

    ActiveMQ的P2P示例(点对点通信) (1)下载安装activemq,启动activeMQ. 详细步骤参考博客:http://www.cnblogs.com/DFX339/p/9050878.h ...

  3. Bootstrap datepicker 在弹出窗体modal中不工作

    解决办法 在 show 方法后面 添加 下面一段代码 $('#modalCard').modal('show');—例子 打开 弹出窗体 //$('#modalCard').modal('hide') ...

  4. L258 技术转让

    We will inform you of the weight, measurements, number of cases, cost of the drawings and other docu ...

  5. Python 的基本运算及分析

    1题   输出1 2 3 4 5 6  8 9 10 . 方法一: count = 0while count < 10 : count += 1 if count == 7 : continue ...

  6. shell脚本实例-nginx日志分析

    统计2018/8/6 PV量 grep "06/Aug/2018" access.log|wc -l 统计当天8:00 到9:00的PV awk '$4>="[06 ...

  7. 使用std::map和std::list存放数据,消耗内存比实际数据大得多

    使用std::map和std::list存放数据,消耗内存比实际数据大得多 场景:项目中需要存储一个结构,如下程序段中TEST_DATA_STRU,结构占24B.但是使用代码中的std::list&l ...

  8. ubantu 安装git

    1.安装git并配置 sudo add-apt-repository ppa:git-core/ppa sudo apt-get update sudo apt-get install git 可以使 ...

  9. TestNG参数化测试-数据提供程序 @DataProvider方式

    在 testng.xml 中指定参数可能会有如下的不足: 1.如果你压根不用 testng.xml. 2.你需要传递复杂的参数,或者从Java中创建参数(复杂对象,对象从属性文件或者数据库中读取的et ...

  10. 某些浏览器没有canvas.toBlob 方法的解决方案

    var dataURLtoBlob = require('blueimp-canvas-to-blob'); // 80x60px GIF image (color black, base64 dat ...