一:安全,还是安全

我入行比较晚,那会Spring MVC什么的都很流行了,一直觉得struts2作为一个Web MVC框架实在太笨重了点。所以虽然之前一直在用,但是其实没有真正研究过。

今天公司又遇到一个比较严重的struts的安全问题,最后检查了很久,换最新版也无效。但是因为公司一直在用strtus2,作为一个爱着自己工作的人(逃),还是决定大致了解一下struts2的源码了。

直接读代码难免一头雾水,这里推荐一本书《Struts2技术内幕》,有书上的理论作指导就容易得多。这本书讲的挺详细,同时在设计思想上也有不少着力,非常值得一读。

看了一部分代码后,仔细调试了一下,确认了这个是一个比较严重的安全问题,不知道是否已被官方发现,但是确实在最新版2.3.15.3中仍存在。已经发了邮件给官方,希望能得到一个好的解决方案。

但是本文的主要的目的不在这里。本文就是理一下struts2的里里外外,不至于遇到问题一头雾水,就足够了。

二:struts2概览

struts2结构图如下(自己画的,可能不严谨):

OGNL是底层的表达式引擎,也是安全方面广为诟病的地方。

XWork是个什么东西呢?它可以理解为一个请求-响应模式的通用框架(不仅仅局限于Web),这个Action就是一个命令。而struts2可以说是XWork在web领域的一个特定实现。

XWork是包括Action/Interceptor/Result几个大部分,还有用于执行流程的ActionProxy和ActionInvoker,以及处理数据的ActionContext和ValueStack。XWork的执行流程如下(这里引用了《Struts2技术内幕》的图):

三:关于框架的设计思想

今天说到在读struts代码,jFinal的作者@jFinal 说struts代码很烂。

可能我功力不够,倒是没觉得代码很烂,struts2的代码层次化、结构化、扩展性其实都做得不错,比如动态插件机制,比如Result是一个接口,里面包含了一个excute()方法用于决定渲染方式等。但是设计思想上,可能与当前的趋势不符了。

struts2有个很重要的设计思想:解耦。它希望框架不要侵入业务,包括servlet API里的request/response,尽量让大家写一个POJO就好了。这个POJO脱离了框架,甚至是在其他领域都是可用的。其实在如今web大行其道的时代,其实也没有人会需要无侵入的框架进行迁移,这种设计也不知该说超前还是过时了,但是反而会带来一些不便。

相反,我觉得框架就该限定领域,好的框架应该提供必要的约束,清晰勾勒出这个领域开发的一种方式,而不是一味追求通用性。这一点我觉得Spring MVC就做的好一些,大家的接受程度也会比较高。场景越确定,框架能做的事越多,开发就越方便,比如jFinal这种框架。

对于struts,我只能说可能当年的web还未一统天下,大家仍有不同场景的需求吧。

PS:Web框架是个很大很热的话题,博主一家之言,大家听听就好。

关于Struts2的碎碎念的更多相关文章

  1. Linux碎碎念

    在学习Linux过程中,有许多有用的小技巧.如果放在纸质的笔记本上,平时查阅会相当不方便.现在以一种“碎碎念”的方式,汇集整理在此,目前还不是很多,但随着学习.工作的深入,后续会陆陆续续添加更多的小技 ...

  2. 一些关于Linux入侵应急响应的碎碎念

    近半年做了很多应急响应项目,针对黑客入侵.但疲于没有时间来总结一些常用的东西,寄希望用这篇博文分享一些安全工程师在处理应急响应时常见的套路,因为方面众多可能有些杂碎. 个人认为入侵响应的核心无外乎四个 ...

  3. 一个谷粉和3年的Google Reader重度使用者的碎碎念

    2013-03-14 上午看到Andy Rubin辞去Android业务主管职务.由Chrome及应用高级副总裁继任的新闻,还在想这会给Android带来什么,中午刷微博的时候就挨了当头一棒:Goog ...

  4. Jerry的碎碎念:SAPUI5, Angular, React和Vue

    去年我去一个国内客户现场时,曾经和他们IT部门的一位架构师聊到关于在SAP平台上进行UI应用的二次开发时,UI框架是选用UI5还是Vue这个话题. 我们代表SAP, 向客户推荐使用UI5是基于以下六点 ...

  5. 结对编程ending-我和洧洧的碎碎念

    应该是第一次和队友分工合作去完成一个项目,其中也经历了跳进不少坑又被拉回来的过程,总体来说这对于我俩也的确是值得纪念的一次经历. 我的碎碎念时间…… 对比个人项目和结对编程项目二者需求,前者重在面对不 ...

  6. C语言 · 分分钟的碎碎念

    算法提高 分分钟的碎碎念   时间限制:1.0s   内存限制:256.0MB      问题描述 以前有个孩子,他分分钟都在碎碎念.不过,他的念头之间是有因果关系的.他会在本子里记录每一个念头,并用 ...

  7. 最近关于Qt学习的一点碎碎念

    最近关于Qt学习的一点碎碎念 一直在使用Qt,但是最近对Qt的认识更加多了一些.所以想把自己的一些想法记录下来. Qt最好的学习资料应该是官方的参考文档了.对Qt的每一个类都有非常详细的介绍.我做了一 ...

  8. Java实现 蓝桥杯VIP 算法提高 分分钟的碎碎念

    算法提高 分分钟的碎碎念 时间限制:1.0s 内存限制:256.0MB 问题描述 以前有个孩子,他分分钟都在碎碎念.不过,他的念头之间是有因果关系的.他会在本子里记录每一个念头,并用箭头画出这个念头的 ...

  9. MySQL碎碎念

    1. 如何修改Mysql的用户密码 mysql> update mysql.user set password=password('hello') where user='root'; mysq ...

随机推荐

  1. centos之jdk安装

    1.环境说明 系统:centos6.7, 2.6.32-573.el6.x86_64; jdk:jdk1.7.0_80 2.下载jdk并上传      下载jdk-7u80-linux-x64.tar ...

  2. Ubuntu各种软件的安装

    普通的例如g++.deadbeef等源中有的软件,可以用apt-get安装 sudo apt-get install XXX 还有很多直接在software center搜索下载 对于下载来源代码需要 ...

  3. verilog中阻塞复制,非阻塞复制,顺序块,并行块之间的关系

    这几个概念是不一样的 顺序块:顺序块中的语句是按顺序执行的,每条语句中的延迟值是与其前一条语句执行的仿真时间有关. 并行块:并行块语句是并行执行的,它里面的每条语句中指定的延迟值都是相对于语句块开始执 ...

  4. 在cad中画一条长500mm,垂直90度的线段

    视频教程奉上 方法1.点击线段按钮,鼠标指定一点,输入500,再输入<90. 方法2,点击线段按钮,鼠标指定一点,输入500,按tab,再输入90.

  5. 字符串比较必须使用strcmp

    char s1[]="this" char *s2 = "this" if(s1=="this"){ printf("s1 is ...

  6. http://docs.aliyun.com/#/rds/best-practices/collocation&security

    http://docs.aliyun.com/#/rds/best-practices/collocation&security

  7. Sprite Kit编程指南中文版下载

    下载地址:http://download.csdn.net/detail/xin814/6032573 关于Sprite Kit 重要提示:  这是API或开发技术的一个初版文档.虽然本文档的技术准确 ...

  8. 用正则匹配一串字符串中的ip地址

    IP地址有4段组成,每一段数字的范围为0-255,在一段文本中提取ip地址可以这样 $src = 'src = alsdlk ks sdf2.3.3.4 234.193.1.120.1232 d.23 ...

  9. 投资学第一章 investments-introduction

    转载请注明来自souldak,微博:@evagle 砖搬多了有点累,今天学学投资学. 这章主要是一些重要的概念.   real assets / financial assets , fixed-in ...

  10. AIDL 发生异常的原因 Android java.lang.SecurityException: Binder invocation to an incorrect interface

    我建立了两个project.一个是activity 的 ,一个是service 的. 在进行两个project通信时,应该有以下几点注意: 1.在activity project中引入service ...