事实上,机场比婚礼殿堂见证了更多真挚的亲吻,医院的墙壁比教堂的聆听了更多祷告。
拦截器有三种方式:
①Action拦截
②全局拦截
③方法拦截
先说说什么是拦截器:
拦截器,顾名思义,拦截请求(Action),可以达到增强Action的功能,框架本身默认提供很多拦截器,大概有35种,但往往实际开发中,还需要自定义一些拦截器,比如:权限(访问)拦截。
再说说怎么实现拦截器: 如果要实现拦截器,需要实现interceptor接口或者继承AbstractInterceptor抽象类,后者用的更多。
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统一一起拦截掉,可以使用全局拦截。
全局拦截与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页面地址。
②将这些不需要拦截的放到另一个包中。
③使用方法拦截。