在这之前

Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小。那么既然是使用Struts已经写好的拦截器,不需要我们去自定义了,那么这个拦截器的基本配置如何进行?在哪里进行配置?
以上,要弄懂基本原理的话,就要先了解Struts运行的大致流程。

Struts的运行大致流程

核心运行流程:
Struts的启动是依靠 StrutsPrepareAndExecuteFilter 过滤器来完成,当过滤器启动时会执行其 init() 方法,它会去读取Struts的配置信息,并将其封装到JavaBean中,然后执行过滤器的 doFilter() 来解析地址,实例化Action并根据result进行页面的跳转。在Action的执行前后,会执行各类功能不同的拦截器。
用一张图来说明以上的过程,就是:
很明显,init() 中读取的配置文件至关重要,这里有几个核心文件被读取,分别是 default.properties、struts-default.xml、struts-plugin.xml、struts.xml,并且按顺序读取,同样的变量和配置项,后读取的配置文件会覆盖已读取的配置文件。这也就是即使前几个文件是Struts配置好的我们没法改变,我们也依然可以通过在struts.xml中进行相关变量的配置来进行最终实现上的改变。
default.properties 中,定义了Struts中大量的常量,也就是许多设置的默认值。
而拦截器这部分的配置信息,在 struts-default.xml 中,它在 struts2-core-x.x.x 核心包的根目录下,它不仅包含了大量bean的定义,还有大量的拦截器、拦截器栈,同时还定义了11种不同类型的页面跳转方式(result-type)等等。(这也就是我们的Action在配置时候总要extends struts-default.xml 的原因)
在struts-default.xml中,默认使用的是 defaultStack 这个拦截器栈,其中包含了一系列的拦截器(如下图)

可以看到,fileUpload拦截器正是默认拦截器栈的一员,而我们,就要从这里入手,来实现我们对上传图片的限制功能。 

如何使用拦截器限制上传图片

我们先来看看源码,在之前已经说过,fileUpload这个拦截器是我们默认拦截器栈中的一员,我们同样在default-struts.xml中来找到该拦截器:
打开Struts文件上传的拦截器org.apache.struts2.interceptor.FileUploadInterceptor,发现其包含三个重要属性

它们分别表示的是:
  • 上传文件的最大长度(单位为字节)(在default.properties我们可以查到struts.multipart.maxSize=2097152,即默认最大为2M大小的文件)
  • 允许上传文件的类型
  • 允许上传文件的文件扩展名。
而之前我们提到的,这些默认的配置可以在struts.xml中将其默认值覆盖,所以我们如果要限制上传为jpg、png类型的最大为1M的图片,那么:

(图例为使用限制文件扩展名的方式) 

以上,叨叨了这么多,其实也就这么简单的几排,就完成了我们想要的功能。另外,还要提醒的是,虽然如此配置让struts帮我们完成了对文件上传的限制,但是假如我们上传了不符合条件的文件,会发生什么?
答案是,系统会报错,并使Action自动直接返回 “input” ,所以不需要在action中的方法出现一个 return "input",同时,我们还要对返回的result name=“input” 进行配置,以便于即使上传了不符的文件,页面也能正常跳转:

(图例让其跳转到mainAction中执行 input() 方法) 

也可以参考如下方式:
至此,我们就对Struts拦截器完成图片上传限制的功能进行了了解和使用。

参考链接和源码

参考链接
  • struts2--上传总结(限制大小和类型 非法上传的跳转)
  • 用文件上传了解struts2拦截器的使用
  • Struts2文件上传
源码地址
  • 源码地址Github
  • 功能实现前,commit id:11e893eea4baea2683d6083368c758a3afe1a0bf
  • 功能实现后,commit id:2a6127d1d50eeeb98fa64e19b8d4321f9d61b360
附:struts.xml概述和配置文件的思维导图

转载于:https://www.cnblogs.com/deng-cc/p/6370322.html

利用Struts拦截器限制上传图片的格式和大小相关推荐

  1. Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】

    应用情形:在web项目中,经常会遇到用户未登录或SESSION失效时用户发出非法的权限操作,如新闻的评论.文件的下载等等,在此我们可以使用struts拦截器对该用户发出的请求进行拦截,拦截后判断用户是 ...

  2. 【vue开发问题-解决方法】(八)利用axios拦截器实现elementUI中加载动画,控制加载区域

    [vue开发问题-解决方法](八)利用axios拦截器实现elementUI中加载动画,控制加载区域 参考文章: (1)[vue开发问题-解决方法](八)利用axios拦截器实现elementUI中加 ...

  3. struts拦截器+注解实现网络安全要求中的日志审计功能

    J2EE项目中出于安全的角度考虑,用户行为审计日志功能必不可少,通过本demo可以实现如下功能: 1.项目中记录审计日志的方法. 2.struts拦截器的基本配置和使用方法. 3.struts拦截器中 ...

  4. Struts拦截器使用

    创建拦截器java程序 package cn.itcast.oa.util;import com.opensymphony.xwork2.ActionInvocation; import com.op ...

  5. Struts 拦截器

    介绍 实现aop的方式 用于实现action之前,之后执行 一般用于事物操作. 一般用于对某些未授权的页面访问的时候,进行拦截操作,拦截非法访问. 开箱即用拦截器 <!-- 拦截器 --> ...

  6. java struts 拦截器_java框架篇---struts实现拦截器

    Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept ...

  7. 【struts2+hibernate+spring项目实战】用户登录校验(struts拦截器)

    一.概述 项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高.但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB ...

  8. 利用mybatis拦截器注解处理sql

    首先@Intercepts注解 可以看这篇文章https://blog.csdn.net/weixin_43505211/article/details/128050083 建个类 实现 Interc ...

  9. vue elementui 上传图片限制格式、大小和尺寸

    需求: 上传图片的格式为:.jpg..jpeg..png 大小为:1M以内 尺寸为:400*400 代码实现: 直接拿的elementui官网的html代码,加了一句:accept="ima ...

最新文章

  1. 【KDD2020-Tutorial】自动推荐系统,Automated Recommendation System
  2. php如何连接mongodb,PHP 连接 MongoDB
  3. underscore.js源码研究(5)
  4. poj 2891 Strange Way to Express Integers
  5. 【英语学习】【WOTD】abecedarian 释义/词源/示例
  6. Appium基础四:Desired Capabilities详讲
  7. 软件测试基础知识 + 面试理论(超详细)
  8. c#写的屏保,好看,不影响任何操作。
  9. 当toB产品经理遇到数据分析
  10. 180729 5行命令win10企业版永久激活方法
  11. 阅读 |《算法图解》读书打卡
  12. 方框加对勾怎么输入_word里如何往方框中加对号?带方框的对号怎么弄,原来是这样的...
  13. Apache Dubbo官网推荐使用建议
  14. Dev GridView网格中格式化 TimeSpan
  15. 目前国内常用的无纸化会议系统——迅控无纸化
  16. 小写字母转换成大写字母(函数)
  17. 【YOLOv5】LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来
  18. pytorch-softmax解决分类问题,用fashion-mnist为例子,再走一遍数据获取到模型预测的流程。深度了解分类指标的递进关系
  19. (附源码)计算机毕业设计SSM基于智慧农业的水果销售系统
  20. 双十一销量预测_最强预估:几个指标倒推双十一数据

热门文章

  1. 输入3个字符串,按由小到大顺序输出
  2. Android新建项目选择SDK的区别
  3. int指令---汇编学习笔记
  4. 【Cannot convert from [[B] to】 @RabbitListener 反序列化报错
  5. 都2021年了,不会还有人连深度学习还不了解吧(六)-- Padding篇
  6. 1063 Set Similarity
  7. 汇编语言直接偏移量操作数
  8. spark 写tidb_优秀的数据工程师,怎么用Spark在TiDB上做OLAP分析
  9. python必学的模块_Python必学的模块有哪些?
  10. JZOJ 5638. 【NOI2018模拟4.8】IIIDX