struts2(三)拦截器
拦截器
需求
如果要访问某一个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(三)拦截器的更多相关文章
- JavaWeb框架_Struts2_(三)---->Struts2的拦截器
2. Struts2的拦截器(使用拦截器实现权限控制) 2.1 拦截器的概述 拦截器是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器.Struts ...
- struts2总结六: Struts2的拦截器
一.Struts2的系统结构图
- Struts2使用拦截器完成权限控制示例
http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求: 要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...
- Struts2【拦截器】就是这么简单
什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Str ...
- (转)Struts2的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/68648101 Struts2的拦截器 拦截器的概述 拦截器,在AOP(Aspect-Orien ...
- 【跟我一步一步学Struts2】——拦截器
前言 前面提到过拦截器.而且说拦截器仅仅能拦截Action.这里拦截器的调用体现了责任链模式.为什么说体现了责任链模式呢? 以下的一段话说的非常明确: Struts2将整个运行划分成若干同样类型的元素 ...
- JavaWeb_(Struts2框架)拦截器interceptor
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- (六)Struts2的拦截器
一.简介 拦截器体系是struts2重要的组成部分.正是大量的内建拦截器完成了该框架的大部分操作. 比如params拦截器将请求参数解析出来,设置Action的属性.servletConfig拦截器负 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
随机推荐
- C++构造函数和析构函数,以及构造函数特殊成员变量和函数的初始化
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制?
目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...
- 在JS文件中,不需要<script>标签
在JS文件中,不需要<script>标签\
- 用FPGA对ASIC进行原型验证的过程(转)
用FPGA对ASIC进行原型验证的过程 reference:http://xilinx.eetrend.com/d6-xilinx/article/2018-10/13736.html 鉴 ...
- DevExpress WinForms使用教程:图表控件 - 内置深入查询
[DevExpress WinForms v18.2下载] 在最新发布的DevExpress WinForms v18.2中,DevExpress WinForms和ASP.NET图表控件引入嵌套系列 ...
- Intellij IDEA生成foreach或者loop 快捷键
iter Iterate (for each..in) itin Iterate (for..in) itli Iterate over a List itar Iterate elements of ...
- cookie的参数
def set_cookie(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, ...
- DeployMan,发布文件的利器
利用Delphi开发app,有时候需要发布文件,如果文件少还不是问题,但文件多的情况下,IDE带的发布功能,就显得捉襟见肘,效率低下了. 通过Project-Deployment,打开发布窗口,如下图 ...
- Strassen algorithm(O(n^lg7))
Let A, B be two square matrices over a ring R. We want to calculate the matrix product C as {\displa ...
- chrome插件 - Manifest文件中的 background
在Manifest中指定background域可以使扩展常驻后台. background可以包含三种属性,分别是scripts.page和persistent. 如果指定了scripts属性,则Chr ...