事实上,机场比婚礼殿堂见证了更多真挚的亲吻,医院的墙壁比教堂的聆听了更多祷告。
拦截器有三种方式:
①Action拦截
②全局拦截
③方法拦截
先说说什么是拦截器:
拦截器,顾名思义,拦截请求(Action),可以达到增强Action的功能,框架本身默认提供很多拦截器,大概有35种,但往往实际开发中,还需要自定义一些拦截器,比如:权限(访问)拦截。
再说说怎么实现拦截器:
如果要实现拦截器,需要实现interceptor接口或者继承AbstractInterceptor抽象类,后者用的更多。
1.Action拦截
interceptor代码:
package com.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class InterceptorDemo 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();
}
}
struts.xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="root" namespace="/" extends="struts-default">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="interceptor1" class="com.interceptor.InterceptorDemo"></interceptor>
</interceptors>
<action name="log*" class="com.action.LogAction" method="log{1}">
<result >/log{1}.jsp</result>
<allowed-methods>login,logout</allowed-methods>
</action>
<action name="add" class="com.action.UserAction">
<result>/addUser.jsp</result>
<result name="fail">/login.jsp</result>
<!-- 注意:在使用自定义的拦截器后,默认拦截器是不生效的,需要添加上默认拦截器 -->
<interceptor-ref name="interceptor1"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
通过以上代码发现,action拦截只能拦截部分拦截请求,如果需要大面积拦截,就会出现很多重读代码,最好的办法就是将指定的部分action统一一起拦截掉,可以使用全局拦截。
2.全局拦截
全局拦截与Action拦截,区别就在于配置文件,Action代码没任何区别。
struts.xml关于拦截器和全局结果集代码:
<interceptors>
<!-- 关联自己写的拦截器 -->
<interceptor name="myInterceptor" class="com.interceptor.InterceptorDemo"></interceptor>
<!-- 把自己的拦截器加载到拦截器栈中-->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 为当前包所有Action配置默认拦截器 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!--全局结果集-->
<global-results>
<result name="fail">/login.jsp</result>
</global-results>
问题1:
返回值问题,因为全局拦截器将包中所有Action都拦截掉,蛋拦截器中的返回值只能固定一个,那么此时,在所有拦截器的Action中,都需要配置与拦截器返回值相同的result,可以将返回值配置成全局结果集。
问题2:
包中某些Action又不希望被拦截,比如:登录 ,登出 ,注册 等,两种解决方案:
①将这些功能直接放到jsp界面中,不使用Action。但是,不要轻易暴露实际访问的jsp页面地址。
②将这些不需要拦截的放到另一个包中。
③使用方法拦截。