struts2 拦截器拦截action中指定方法可以吗

在Struts2中,我的Action中不管有execute方法,还有edit()list()add()等方法,我如果只想让拦截器拦截edit方法和add方法,请问可以吗?... 在Struts2中,我的Action中不管有execute方法,还有edit() list() add()等方法,我如果只想让拦截器拦截edit方法和add方法,请问可以吗?如果可以请告诉我一下怎么写。
我说的是拦截器拦截某些action方法。不是拦截所有的action方法,怎么实现。
展开
 我来答
King无所不知
2011-04-12 · 超过11用户采纳过TA的回答
知道答主
回答量:27
采纳率:0%
帮助的人:22.8万
展开全部
使用MethodFilterInterceptor 自定义方法过滤拦截器,然后:
在struts.xml配置文件中,找到interceptor-ref 标签,添加:
<param name="拦截器名称.includeMethods">edit,add</param>

自定义拦截器:

package net.hncu.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor3 extends MethodFilterInterceptor{
//拦截器的名称
private String interceptorName;

public void setInterceptorName(String interceptorName) {
this.interceptorName = interceptorName;
}

//实现拦截的方法
public String intercept(ActionInvocation invocation) throws Exception {

System.out.println(interceptorName + ":-----2拦截前操作-----");

String result = invocation.invoke();

System.out.println(interceptorName + ":------2拦截后操作------");

return result;
}
}

给一个struts.xml文件你参考:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<!-- struts为配置文件根元素-->
<struts>
<!-- Action必须放在指定的包名空间中-->
<package name="struts2" extends="struts-default">
<interceptors>
<interceptor name="myInter3" class="net.hncu.interceptor.MyInterceptor3">
<param name="interceptorName">过滤拦截器</param>
</interceptor>
<interceptor-stack name="myInterStack">
<interceptor-ref name="myInter3">
<param name="interceptorName">自定义过滤拦截器</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>

<action name="login" class="net.hncu.struts2.action.LoginAction">
<result name="success">/login_success.jsp</result>
<result name="error">/login_failure.jsp</result>
<result name="input">login.jsp</result>

<interceptor-ref name="myInterStack">
<param name="myInter3.includeMethods">edit,add</param>
<!-- 用includeMethods指定被拦截的名称 -->
</interceptor-ref>
</action>
</package>

<!-- 指定资源文件baseName为messageResource -->
<constant name="struts.custom.i18n.resources" value="messageResource"></constant>
</struts>
Storm代理
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I... 点击进入详情页
本回答由Storm代理提供
liangjian103
推荐于2016-04-29
知道答主
回答量:8
采纳率:0%
帮助的人:4.6万
展开全部
1.继承类MethodFilterInterceptor(此类是类AbstractInterceptor的子类)

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/*
*拦截指定方法
*/
public class MyFilterInterceptor extends MethodFilterInterceptor{
private static final long serialVersionUID = 1L;
private String name;
public void setName(String name)
{
this.name = name;
}
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//取得请求相关的ActionContext实例
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
//取出名为user的Session属性
String user = (String)session.get("user");
//如果没有登陆,或者登陆所用的用户名不是scott,都返回重新登陆
if (user != null && user.equals("scott") )
{
return invocation.invoke();
}
//没有登陆,将服务器提示设置成一个HttpServletRequest属性
ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统");
//直接返回login的逻辑视图
return Action.LOGIN;
}

}

2.struts.xml配置

<package name="site" extends="struts-default" namespace="/site">
<interceptors>
<!-- 定义了一个名为authority的拦截器 -->
<interceptor name="authority" class="cn.zgcyx.filter.MyFilterInterceptor"/> <!--上面自定义的拦截器类-->
<interceptor-stack name="myDefault">
<interceptor-ref name="authority"> <!-- 引用拦截器 -->
<param name="includeMethods">getALL,getPart,listUser</param> <!-- 设置需要拦截的方法,多个以逗号隔开 -->
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefault"></default-interceptor-ref>

<!-- 全局 -->
<global-results>
<!-- 当返回login视图名时,转入/login.jsp页面 -->
<result name="login">/login.jsp</result>
</global-results>
<action name="site" class="siteServiceAction">

<!--省略跳转-->

</action>

</package>

参考资料: http://tanglei528.blog.163.com/blog/static/4335339920109993937618/

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
华夏名
2011-04-02
知道答主
回答量:18
采纳率:0%
帮助的人:0
展开全部
1)创建继承MethodFilterInterceptor的方法拦截器,并在配置时把你要拦截的方法加入到includeMethods结点中,可参造liangjian103的回答
2)至于你所说只想拦截某些action,如果你不是采用通配符的方式,即你是有几个action类就要在struts.xml中配置几个action结点的话,那就简单,哪些action要拦截,就在那些action下面引用这个拦截器,写法类似yingjianxuehun 的回答 。
如果你是采用通配符的方式,即struts.xml中只有一个action结点的话,那便在拦截器中对action进行滤,获取到请求的路径后对路径进行判断
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liyaming_liym
2011-04-01 · TA获得超过1222个赞
知道小有建树答主
回答量:525
采纳率:0%
帮助的人:309万
展开全部
可以的。在你struts.xml里面的action标签内,增加method方法。比如:method="edit"或method="add"。如果不加的话,它就默认执行execute()方法。
追问
我说的是拦截器拦截某些action方法。不是拦截所有的action方法
追答
对啊  要拦截哪个action方法,就在哪个标签内增加method属性即可。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fhoenix_yu
2011-04-03
知道答主
回答量:13
采纳率:0%
帮助的人:14.8万
展开全部
在配置文件里面设置:
<action name="你的action" class=“类名”>
<interceptor-ref name="defaultStack">
<param name="你指定的拦截器.includeMethods">你要拦截的方法</param>
</interceptor-ref>
</action>
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式