如何获取struts2执行动作的method?
struts2的拦截器功能比较强大,但最近遇到一个困惑的问题,研究了好长时间仍没有方法。
在struts2中一个form有多个action时,可以很简单实现:
<s:form action="submit" namespace="/demo">
<s:textfield name="msg" label="输入内容" />
<s:submit name="save" value="保存" align="left" method="save" />
<s:submit name="print" value="打印" align="left" method="print" />
</s:form>
但是我想做一个统一的权限过滤器,也就是说save和print是有权限的才能执行,我现在无法在demo.action得到method,在哪个过程里做呢?请大虾给予帮助!
stuts1.*里面有一个getMethodName的过程,可struts2里不知道该如何做
在拦截器中:
protected String doIntercept(ActionInvocation inter) throws Exception {
通过 :
log.debug([b]inter.getProxy().getMethod()[/b]);
可以获取你所执行的Method方法。
可以满足你的需求。 :lol:
将方法名挂在URL的参数后面不就得了,我们系统现在就是这么做的,然后在ACTION中判断传过来的方法名,进行不对的方法调用
还有就是在界面用隐藏域搞一个方法名的变量,点不同的按钮就可以给这个变量动态给值。
在struts2配置文件中有个ApplicationFramework.xml的文件
可以在这里添加拦截器,拦截Action中除get,set方法外的所有方法:
/aop:aspect
/aop:config
在类可以通过
Object o;
o = pjp.proceed();
String shortName = pjp.toShortString();
String methodName = shortName.substring(10, shortName.length() - 1);//获取方法名称
String className = pjp.getTarget().getClass().getName();//获取该方法所在的包.
自定义一个拦截器,在该拦截器中实现权限的检查,检查不通过不执行action
public class AuthorityInterceptor extends AbstractInterceptor
{
public String intercept(ActionInvocation invocation) throws Exception
{
ActionContext ctx = invocation.getInvocationContext();
ValueStack vs = invocation.getStack();
Map session = ctx.getSession();
// 读取必要信息
String user = (String)session.get("user");
// TODO 权限检查
if (/**检验OK*/)
{
//执行action
return invocation.invoke();
}
// 返回错误
return Action.LOGIN;
}
}
对所有要进行权限检查的action都使用该拦截器进行权限检查.
<!-- 权限控制拦截器-->
<!-- 拦截器-->
<!-- struts2默认拦截器栈 -->
<!-- 权限控制拦截器 -->