关于Struts2的碎碎念
一:安全,还是安全
我入行比较晚,那会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的碎碎念的更多相关文章
- Linux碎碎念
在学习Linux过程中,有许多有用的小技巧.如果放在纸质的笔记本上,平时查阅会相当不方便.现在以一种“碎碎念”的方式,汇集整理在此,目前还不是很多,但随着学习.工作的深入,后续会陆陆续续添加更多的小技 ...
- 一些关于Linux入侵应急响应的碎碎念
近半年做了很多应急响应项目,针对黑客入侵.但疲于没有时间来总结一些常用的东西,寄希望用这篇博文分享一些安全工程师在处理应急响应时常见的套路,因为方面众多可能有些杂碎. 个人认为入侵响应的核心无外乎四个 ...
- 一个谷粉和3年的Google Reader重度使用者的碎碎念
2013-03-14 上午看到Andy Rubin辞去Android业务主管职务.由Chrome及应用高级副总裁继任的新闻,还在想这会给Android带来什么,中午刷微博的时候就挨了当头一棒:Goog ...
- Jerry的碎碎念:SAPUI5, Angular, React和Vue
去年我去一个国内客户现场时,曾经和他们IT部门的一位架构师聊到关于在SAP平台上进行UI应用的二次开发时,UI框架是选用UI5还是Vue这个话题. 我们代表SAP, 向客户推荐使用UI5是基于以下六点 ...
- 结对编程ending-我和洧洧的碎碎念
应该是第一次和队友分工合作去完成一个项目,其中也经历了跳进不少坑又被拉回来的过程,总体来说这对于我俩也的确是值得纪念的一次经历. 我的碎碎念时间…… 对比个人项目和结对编程项目二者需求,前者重在面对不 ...
- C语言 · 分分钟的碎碎念
算法提高 分分钟的碎碎念 时间限制:1.0s 内存限制:256.0MB 问题描述 以前有个孩子,他分分钟都在碎碎念.不过,他的念头之间是有因果关系的.他会在本子里记录每一个念头,并用 ...
- 最近关于Qt学习的一点碎碎念
最近关于Qt学习的一点碎碎念 一直在使用Qt,但是最近对Qt的认识更加多了一些.所以想把自己的一些想法记录下来. Qt最好的学习资料应该是官方的参考文档了.对Qt的每一个类都有非常详细的介绍.我做了一 ...
- Java实现 蓝桥杯VIP 算法提高 分分钟的碎碎念
算法提高 分分钟的碎碎念 时间限制:1.0s 内存限制:256.0MB 问题描述 以前有个孩子,他分分钟都在碎碎念.不过,他的念头之间是有因果关系的.他会在本子里记录每一个念头,并用箭头画出这个念头的 ...
- MySQL碎碎念
1. 如何修改Mysql的用户密码 mysql> update mysql.user set password=password('hello') where user='root'; mysq ...
随机推荐
- Oracle查看被锁的表和解锁[转]
查看被锁的表 select p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$p ...
- c 陷阱与缺陷(一)
1.程序在设计时,往往得出正确的结果,但是它并不是程序员自己想要的. 例如: printf("hello world!") 编译器进行编译时不会出现任何问题,但是结果: 提示竟然出 ...
- cocos2d-x -------之笔记篇 环境的安装
cocos2d-x -------之笔记篇 环境的安装 使用到的工具有VS2010 cygwin android-NDK eclipse android SDK 1.首先是android相关环境的安 ...
- SLC和MLC
SLC 和MLC分别是是Single Layer Cell 单层单元和Multi-Level Cell多层单元的缩写,SLC的特点是成本高.容量小.速度快,而MLC的特点是容量大成本低,但是速度慢.M ...
- Android4: Write Storage权限问题
原文:Android4: Write Storage权限问题 2.3中声明 <uses-permission android:name="android.permission.WRIT ...
- [原]容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...
- Unix/Linux环境C编程入门教程(3) Oracle Linux 环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 2010年9月,Oracle Enterprise Linux发布新版内核--Un ...
- [Leetcode][Python]29: Divide Two Integers
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 29: Divide Two Integershttps://oj.leetc ...
- ldap理论属于概念缩略词
Standalone LDAP Daemon, slapd(standalone lightweight access protocol) ldap 389 default listener port ...
- Swift初体验(三)
/*******************************************************************************/ // 协议 protocol Des ...