在这之前

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拦截器完成图片上传限制的功能进行了了解和使用。


参考链接和源码

参考链接

源码地址
  • 源码地址Github
  • 功能实现前,commit id:11e893eea4baea2683d6083368c758a3afe1a0bf
  • 功能实现后,commit id:2a6127d1d50eeeb98fa64e19b8d4321f9d61b360

附:struts.xml概述和配置文件的思维导图
 


利用Struts拦截器限制上传图片的格式和大小的更多相关文章

  1. [置顶] 使用struts拦截器+注解实现网络安全要求中的日志审计功能

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

  2. Struts拦截器设置完的值为什么在页面取不到

    Struts拦截器设置完的值为什么在页面取不到. ActionContext ac = (ActionContext) invocation.getInvocationContext(); ac.pu ...

  3. struts struts拦截器(过滤器)

    在struts中尽量避免自定义拦截器,因为大部分需要自己定义拦截器的时候,设计思路就不对了.大部分拦截器框架都有给你定义好了.而且如果在struts中定义拦截器相当于和这个框架绑定了,假如以后要扩展或 ...

  4. SSH进阶(2)——用Struts拦截器实现登陆限制

    拦截器从字面意思来看就是限制.限制用户訪问某些网页.在Action提出请求之前用拦截器来做权限设置,让符合的用户跳入对应的界面中.近期做的一个商城项目中就用到了自己定义的拦截器,实现了一个简单的ses ...

  5. 利用Struts2拦截器完成文件上传功能

    Struts2的图片上传以及页面展示图片 在上次的CRUD基础上加上图片上传功能 (https://www.cnblogs.com/liuwenwu9527/p/11108611.html) 文件上传 ...

  6. struts 拦截器 Interceptor

         拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用.正如上面 Struts2的Reference中讲述的,Stru ...

  7. struts拦截器实现原理

    图1: 上1来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请 ...

  8. struts拦截器

    struts中的拦截器相当于过滤器的作用 一在struts.xml中配置拦截器或拦截器栈 <interceptors>!--全部的拦截器 <interceptor name=&quo ...

  9. (转)Struts 拦截器

    一.拦截器是怎么实现: 实际上它是用Java中的动态代理来实现的 二.拦截器在Struts2中的应用 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作.像params拦截器将http请 ...

随机推荐

  1. MySQL (五)

    1 连接查询简介 将多张表(可以大于2)进行记录的连接(按照某个指定的条件进行数据拼接). 最终结果:记录数可能会有变化,字段书一定会增加(至少两张表的合并). 连接查询:join,使用方式:左表 j ...

  2. llvm+clang编译安装

    最近一段时间在llvm+clang上做一些东西,所以顺便将自己如何编译安装llvm+clang写了篇文章发在这里,希望能帮助刚接触llvm+clang的童鞋少走一些弯路(我刚接触的时候为了编译安装这个 ...

  3. 转载_2016,Java成神初年

    原文地址:http://blog.csdn.net/chenssy/article/details/54017826 2016,Java成神初年.. -------------- 时间2016.12. ...

  4. Android笔记: 播放提示音 的简单方法

    public static void sendSound(Context mContext) { //上下文 Uri mUri= RingtoneManager.getDefaultUri(Ringt ...

  5. AndroidTv Home界面实现原理(一)——Leanback 库的使用

    接下去应该是梳理一下 Android Tv 主界面实现原理及解析的一个系列博客了,大体上的安排是先介绍 Google 官方提供的 Leanback 库的使用,如何使用该库来实现简单的 Home 界面, ...

  6. 【Java学习笔记之三十】详解Java单例(Singleton)模式

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  7. 10分钟学会ES7+ES8

    撰文为何 身为一个前端开发者,ECMAScript(以下简称ES)早已广泛应用在我们的工作当中.了解ECMA机构流程的人应该知道,标准委员会会在每年的6月份正式发布一次规范的修订,而这次的发布也将作为 ...

  8. 一,ESP8266下载和刷固件

    用自己的小板测试...... 安排上呢 一, ESP8266下载和刷固件(Lua开发----体验一下lua开发的魅力所在) 二, 控制一个灯亮灭 三, TCP服务器 四, TCP客户端 五, UDP ...

  9. 关于SCSI/SATA/IDE硬盘的比较

    看linux的书时,发现许多地方提到SCSI/SATA/IDE这几种硬盘接口,对这些硬盘的概念和区别感到很模糊.所以特意查了一些资料,基本上算是弄懂了他们的区别. 目前硬盘最要分为3种.也即:IDE. ...

  10. MySQL索引实战经验总结

    MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源,本篇总结了一些MySQL索引实战经验. 索引是用于快速查找记录的一种数据结构.索引就像是数据库中 ...