一:安全,还是安全

我入行比较晚,那会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. Linux计划任务(转载)

    Linux计划任务(转载) Linux的计划任务是系统管理方面的一个重要内容,是系统自动完成工作的一种实现方式,正因为有了计划任务,我们才可以完全实现系统管理的脚本化和自动化. 关于计划任务,Linu ...

  2. iis7.0/8.0rewrite规则

    首先在网站 web.config 配置文件的 configuration 节点中加入如下代码: <system.webServer> <rewrite> <rules&g ...

  3. ie6,ie7,ie8 css bug汇总以及兼容解决方法

    1:li边距“无故”增加 任何事情都是有原因的,li边距也不例外. 先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑,仔细“研究”发现是 ...

  4. ubuntu远程windows服务器

    ubuntu端: sudo apt-get install rdesktop windows端: 需要允许此windows远程访问.我的windows是windows server2012,基本操作: ...

  5. codeforces 659C . Tanya and Toys 二分

    题目链接 将给出的已经有了的排序, 在前面加上0, 后面加上1e9+1. 然后对相邻的两项判断. 如果相邻两项之间的数的和小于m, 那么全都选上, m减去相应的值. 如果大于m, 那么二分判断最多能选 ...

  6. asp.net内置对象session和cookie

    1.各个机器的session对象不同,不同浏览器之间不通用(换个浏览器,是个新的session). 2.session状态对象起始于网页打开,终止于网页关闭,生命周期有限. 3.关闭浏览器/超时的情况 ...

  7. JSP中的Attribute和InitParameter

    属性:Attribute类型:应用/上下文,请求,会话(ServletContext,HttpServletRequest/ServletRequest,HttpSession)设置方法:setAtt ...

  8. 《Linux 设备驱动程序》读后感。 并发,竞态,死锁。

    1. 概念 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. 来源: 1. Linux ...

  9. linux内核源码阅读之facebook硬盘加速flashcache之八

    前面我们的分析中重点关注正常的数据流程,这一小节关注如果有异常,那么流程是怎么走完的呢? 1)创建新任务时kcached_job申请不到 2)读写命中时cache块为忙 3)系统关机时处理,系统开机时 ...

  10. [置顶] block一点也不神秘————如何利用block进行回调

    我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...