Struts2 2.5.2的套路

转载自霜铭

最近接触了Struts2这个JavaWeb框架,结果被套路了,而且套路的很惨。

要学Struts2 就必然要下载Struts2的jar包,在官网上下载了最新的,没错就是这个:

这个东西真是把我快搞疯了。

然后有了这个东西就开始我的配置Struts2之旅,我没有用MyEclipse,我用的是Eclipse,我根据书上把关键的几个包放在了WEB-INF下的lib文件夹下,

然后满还期待的写了一个action和两个jsp文件,配置了web.xml的过滤器、添加了struts.xml,之后满怀信心的运行了,结果失败了。连JSP文件都加载不出来,感觉快要崩溃了,赶紧对照书中的各个部分看了又看,结果并没有发现问题,查看了Tomcat的日志文件,发现找不到一个类(NotFindClass)—org.apache.struts2.dispatcher.FilterDispather,我打开了这个Jar包就是这个,发现FilterDispather这个类并没有

我郁闷了。赶紧百度,发现从好像从Struts2 2.1之后就没有再用FilterDispather这个分发器了,而是用的上面图中的第三个类,也就是StrutsPrepareAndExecuteFilter这个累,我干煎吧web.xml中的过滤器中的内容改成百度到的org.apache.struts2.dispatcher.ng.StrutsPrepareAndExecuteFilter,运行还是出错说是找不到这个类,我打开包一看发现没有ng这个文件夹,去掉ng后变成org.apache.struts2.dispatcher.StrutsPrepareAndExecuteFilter

运行又出错误,连Tomcat是运行不起来。是找不到log4的东东。我赶紧百度查到需要这个日志的包赶紧加上

以下是我导入的所有的包

再次运行,Tomcat运行正常了,可是JSP文件还是打不开,查书,百度,google,用了很多方法才发现是Struts.xml除了问题。Struts.xml的头没有这一段话

“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
“http://struts.apache.org/dtds/struts-2.0.dtd”>

加上了后果然JSP可以运行了,终于算是吧Struts2给配置好了,可以高兴了吧,结果接下来的几点让我有崩溃了

先是在通过URL执行action的方法就是这个样子:http://localhost:8080/Struts2/Login!login.action,也就是执行Login映射的Action类中的login自定义方法(只要返回String类型的函数都可以),结果很悲催的出现了404错误,怎和会找不到呢,之前运行http://localhost:8080/Struts2/Login.action都没有问题怎么这下出问题了,找不到,不应该啊,出错也是出的500服务器错误啊,检查了struts.xml中的映射,完全没有问题,赶紧又百度(百度是个好东西,也是个烂东西)。发现原来Strust2提供了一种配置,用于禁用DMI,你可以在struts.xml文件中,使用constant元素将struts.enable.DynamicMethodInvocation属性设置为true,来启动DMI。也就是在package标签上struts标签下加上这么一句

高兴的以为解决的,结果呢,被套路的完全没有问题,一遍遍的检查,甚至重新敲一边,结果都是一样的,大自然的规律果然没法避免呢(^.^),纠结了2个多小时,终于在这个网页找到了正确答案http://www.05935.com/bc/554840/

里面说的是在是用struts2 2.5版本的包的时候,出现一个很恶心的问题,就是使用动态方法的时候,报这样一个问题:This method: login for action user is not allowed!

和我的问题一样,作者果然是大牛,在看源代码的时候发现了

原来是struts2 2.5版本的安全度提高了一个台阶,所有不安全的访问都必须要在Struts.xml中声明允许,接下来的问题也是因为版本的问题

在使用通配符的时候出现了问题你就是 {1} 获取不到 * 所表示的字符,一开始我没有往版本上考虑,我一遍一遍的排查,发现是这个通配符的问题,之前并没有想到,因为出的还是404 action找不到的问题,我先不用通配符,能正确显示,使用通配符导致Action不能区别访问,


/success.jsp
/error.jsp
*

上面的不用通配符,下面的用了通配符却出错了,一边一边的改这个配置


/success.jsp
/error.jsp
*

结果这个可以访问到,于是我发现问题出在了 {1} 这个符号上,最后发现这是struts2 2.5 的又一个新特性—通配符禁止使用,我想应该是这种操作虽然对于编程人员来说简化了许多操作,但是对系统来说却增加了系统的开销。所以默认禁止使用通配符,需要加入允许操作才可以

红线标记的两句话就是开启这个的秘密。终于解决了,错,struts.xml显示这两个东西是没有的,瞬间懵逼了,没有,怎么可能,又开始检查文件,发现并没有错误,又纠结了好长时间最终想到是不是还是版本的问题,看了看struts.xml

“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
“http://struts.apache.org/dtds/struts-2.0.dtd”>

果然是版本的问题,赶紧改正

“-//Apache Software Foundation//DTD Struts Configuration 2.5//EN”
“http://struts.apache.org/dtds/struts-2.5.dtd”>

这下没问题了,这下是完全成功了,终于从Struts2 2.5的套路中走出来了,不得不说2.5的套路太深了,我都无言以对了,但是从另一个方面来看,他禁止了许多不安全或是对系统来说负担过中的功能,这也是应该引导编程人员进步的阶梯吧,从struts2 的更新开始就是对struts2的优化开始。

新的东西出现的很快,当我们的教材还是以前的版本时,就已经跟不上了,我们需要去接触最新的东西,即使很难,这是因为新的东西和旧的东西有很大的改变,当这种差异显现的时候,头疼的就是程序员了,这是为什么错了,怎么又错了,欸,怎么对了,好奇怪。原来我接触JAVAFX2.0的时候也很头疼,因为这种GUI很新,和旧的AWT、SWING完全不是一个思想,可以说是更高层的抽象了。扯远了,以上就是我在最新的Strut2 2.5的版本上发现的新的,估计以后会发现更多,希望可以解决你们的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值