struts2 拦截器拦截action中指定方法可以吗
在Struts2中,我的Action中不管有execute方法,还有edit()list()add()等方法,我如果只想让拦截器拦截edit方法和add方法,请问可以吗?...
在Struts2中,我的Action中不管有execute方法,还有edit() list() add()等方法,我如果只想让拦截器拦截edit方法和add方法,请问可以吗?如果可以请告诉我一下怎么写。
我说的是拦截器拦截某些action方法。不是拦截所有的action方法,怎么实现。 展开
我说的是拦截器拦截某些action方法。不是拦截所有的action方法,怎么实现。 展开
7个回答
展开全部
使用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>
在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>
展开全部
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>
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/
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1)创建继承MethodFilterInterceptor的方法拦截器,并在配置时把你要拦截的方法加入到includeMethods结点中,可参造liangjian103的回答
2)至于你所说只想拦截某些action,如果你不是采用通配符的方式,即你是有几个action类就要在struts.xml中配置几个action结点的话,那就简单,哪些action要拦截,就在那些action下面引用这个拦截器,写法类似yingjianxuehun 的回答 。
如果你是采用通配符的方式,即struts.xml中只有一个action结点的话,那便在拦截器中对action进行滤,获取到请求的路径后对路径进行判断
2)至于你所说只想拦截某些action,如果你不是采用通配符的方式,即你是有几个action类就要在struts.xml中配置几个action结点的话,那就简单,哪些action要拦截,就在那些action下面引用这个拦截器,写法类似yingjianxuehun 的回答 。
如果你是采用通配符的方式,即struts.xml中只有一个action结点的话,那便在拦截器中对action进行滤,获取到请求的路径后对路径进行判断
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以的。在你struts.xml里面的action标签内,增加method方法。比如:method="edit"或method="add"。如果不加的话,它就默认执行execute()方法。
追问
我说的是拦截器拦截某些action方法。不是拦截所有的action方法
追答
对啊 要拦截哪个action方法,就在哪个标签内增加method属性即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在配置文件里面设置:
<action name="你的action" class=“类名”>
<interceptor-ref name="defaultStack">
<param name="你指定的拦截器.includeMethods">你要拦截的方法</param>
</interceptor-ref>
</action>
<action name="你的action" class=“类名”>
<interceptor-ref name="defaultStack">
<param name="你指定的拦截器.includeMethods">你要拦截的方法</param>
</interceptor-ref>
</action>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询