您的位置:首页 > 编程语言 > Java开发

Struts拦截器

2017-06-27 14:40 183 查看
拦截器,拦截请求(Action),可以达到增强Action的功能,框架本身默认提供了很多拦截器,大概有35种,但往往实际开发中还要已定义拦截器,譬如:权限(访问)拦截器。

如果要实现拦截器,需要实现Interceptor接口或者AbstractInterceptor抽象类

struts.xml的配置:

<package name="myPackage" extends="struts-default">
<interceptors>
<interceptor name="Interceptor1" class = "com.interceptor.InterceptorDemo1">

</interceptor>
</interceptors>
<action name="log*" class="com.action.LoginAction" method="log{1}">
<result name="success">log{1}.jsp</result>
</action>
<action name="adduser" class="com.action.UserAction" method="add">
<result name="success" >user.jsp</result>
<result name="fail">login.jsp</result>
<interceptor-ref name="Interceptor1"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>


loginAction中的代码

public String login(){
System.out.println("执行login");
return "success";
}
public String logout(){
System.out.println("执行logout");
return "success";
}

public String execute(){
System.out.println("执行Action");
return "success";
}


InterceptorDemo1.java中的配置:

public class InterceptorDemo1 extends AbstractInterceptor{

@Override
public String intercept(ActionInvocation invocation) throws Exception {
String user = (String)ActionContext.getContext().getSession().get("user");
if(user==null||"".equals(user)){
return "fail";
}
return invocation.invoke();
}
}


再创建相应的jsp文件实现Action拦截过程的演示。

全局拦截需要在

<interceptors>
<interceptor name="Interceptor1" class="com.interceptor.InterceptorDemo1"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="Interceptor1"/>
<interceptor-ref name="defaultStack"/>
<interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>


问题1:返回值问题。因为全局拦截将包中的所有Action都拦截掉,但拦截器的返回值只能固定一个,那么此时,在所有被拦截的Action中都要配置与拦截器返回值相同的result,可以将此返回值配置为全局结果集。

<interceptors>
<interceptor name="Interceptor1" class="com.interceptor.InterceptorDemo1"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="Interceptor1"/>
<interceptor-ref name="defaultStack"/>
<interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<global-results>
<result name="fail" type="redirect">login.jsp</result>
</global-results>


问题2:包中的某些个别Action不希望拦截,譬如:登录,登出,注册等。两种解决方案:

1)将这些功能直接放入jsp页面,不使用Action 注意:不要轻易暴露实际操作性的jsp页面地址。

2)将这些功能的Action单独放入另外一个包中,或者使用方法拦截。

方法拦截:

public class InterceptorDemo3 extends MethodFilterInterceptor{
protected String doIntercept(ActionInvocation invocation) throws Exception{
System.out.println("执行拦截");
return invocation.invoke();
}


在struts中配置:

<action name="user" class ="com.action.UserAction" method="{1}">
<result name="success">{1}user.jsp</result>
<interceptor-ref name="Interceptor3">
<param name="incluseMethods">add,edit</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</action>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: