struts html标签配置文件,struts2 <allowed-methods > 标签配置

1.在struts2   2.5版本中添加了对方法访问的权限,如果没有被添加到 方法的标签,将会报一下错误

5:05:18.078 [http-apr-8020-exec-8] ERROR org.apache.struts2.dispatcher.Dispatcher - Could not find action or result: /core/DayFirst!login.do

com.opensymphony.xwork2.config.ConfigurationException: Method login for action DayFirst is not allowed!at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:203) ~[struts2-core-2.5.14.1.jar:?]

at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:76) ~[struts2-core-2.5.14.1.jar:?]

at org.apache.struts2.rest.RestActionProxyFactory.createActionProxy(RestActionProxyFactory.java:50) ~[struts2-rest-plugin-2.5.14.1.jar:?]

at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:564) [struts2-core-2.5.14.1.jar:?]

at org.apache.struts2.dispatcher.ExecuteOperations.executeAction(ExecuteOperations.java:79) [struts2-core-2.5.14.1.jar:?]

at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:141) [struts2-core-2.5.14.1.jar:?]

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.73]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.73]

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218) [catalina.jar:7.0.73]

at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:122) [catalina.jar:7.0.73]

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) [catalina.jar:7.0.73]

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) [catalina.jar:7.0.73]

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) [catalina.jar:7.0.73]

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) [catalina.jar:7.0.73]

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:958) [catalina.jar:7.0.73]

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [catalina.jar:7.0.73]

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452) [catalina.jar:7.0.73]

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087) [tomcat-coyote.jar:7.0.73]

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) [tomcat-coyote.jar:7.0.73]

at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2517) [tomcat-coyote.jar:7.0.73]

at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2506) [tomcat-coyote.jar:7.0.73]

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_79]

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_79]

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-coyote.jar:7.0.73]

at java.lang.Thread.run(Thread.java:745) [?:1.7.0_79]

解决方法:在struts2 的配置文件中加上regex:*即可。配置文件如下

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

"http://struts.apache.org/dtds/struts-2.5.dtd">

/WEB-INF/view/success.jsp

regex:*

当然问题是解决了,看着也很简单就是正则表达式,但是struts2 的原理是什么为什么要这么做?

2.分析怎么解决这个问题的。首先在控制台查看异常,最先出现异常的类先打印,所以直接看第一行的异常DefaultActionProxy.java:203 ,找到如下地方

601b7494e1cbbc6c7bc68caabfb82bc9.png

配置文件是在server容器启动时候就开始执行了,为什么会这样,是因为配置文件的初始化放在struts2 的strutsPrepareAndExcuteFilter  的init() 方法中。再看this.config.isAllowedMethod 这个方法是判断传入进来的方法是否在配置文件中有。

b3a77a716a1eef90932df754010282be.png

this.allowedMethods.isAllowed(method) 这个类的这个方法控制了action 方法的访问权限

查看AllowedMethod 这个类, 标签是怎么被解析的

public static AllowedMethods build(boolean strictMethodInvocation, Setmethods, String defaultRegex) {

Set allowedMethods = newHashSet();

Iterator i$=methods.iterator();while(true) {while(i$.hasNext()) {

String method=(String)i$.next();boolean isPattern = false;

StringBuilder methodPattern= newStringBuilder();int len =method.length();for(int x = 0; x < len; ++x) {char c =method.charAt(x);if (x < len - 2 && c == ‘{‘ && ‘}‘ == method.charAt(x + 2)) {

methodPattern.append(defaultRegex);

isPattern= true;

x+= 2;

}else{

methodPattern.append(c);

}

}if (isPattern && !method.startsWith("regex:") && !strictMethodInvocation) {

allowedMethods.add(new AllowedMethods.PatternAllowedMethod(methodPattern.toString(), method));

} else {

String pattern;

if (method.startsWith("regex:")) {

pattern = method.substring(method.indexOf(":") + 1);

allowedMethods.add(new AllowedMethods.PatternAllowedMethod(pattern, method));

} else if (method.contains("*") && !method.startsWith("regex:") && !strictMethodInvocation) {

pattern = method.replace("*", defaultRegex);

allowedMethods.add(new AllowedMethods.PatternAllowedMethod(pattern, method));

} else if (!isPattern) {

allowedMethods.add(new AllowedMethods.LiteralAllowedMethod(method));

} else {

LOG.trace("Ignoring method name: [{}] when SMI is set to [{}]", method, strictMethodInvocation);

}

}

}

LOG.debug("Defined allowed methods: {}", allowedMethods);return newAllowedMethods(strictMethodInvocation, allowedMethods, defaultRegex);

}

}

大致的意思就是, 将 标签的内容放入allowedMethods 这个set 集合中,以便调用action 的方法时候决定这个action的方法是否可以被调用。

这里的放入规则遵循标红的判断,带有regex: 前缀的,带有* 的将被单独处理,就是将所有的方法都通过。

9c6aeeb8cbee301d71da9d28dc5122e8.png

8874515eee6811624ca0a0ef14a5f49d.png

看上面的debug 图,发现struts2 默认带了一些有权限的方法 index input 等。

最后还有 regex:.*   标签也可以解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值