Struts2整理-----Struts2拦截器
struts2的拦截器是struts2的核心,其底层实现使用了Java的反射机制与动态代理。
实现struts2拦截器的方法
1.实现Interceptor接口,实现init(),destory(),intercept()方法。
2.继承AbstractInterceptor类,重写intercept()方法.
3.继承MethodFilterInterceptor类,重写doIntercept()方法
拦截器实现原理:
当请求struts2的action时,strus2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器
拦截器和过滤器比较
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
新建一个案例
新建Action
package com.aaron.action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private static final long serialVersionUID = 1L; private String name; // 用户登录 public String login() { return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
写一个过滤器
package com.aaron.action; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.StrutsStatics; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class AuthorityInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 1L; // 拦截Action处理的拦截方法 public String intercept(ActionInvocation invocation) throws Exception { System.out.println("进入拦截器》》》》》》》"); ActionContext ac=invocation.getInvocationContext(); //struts2 拦截器Interceptor中取得request HttpServletRequest request=(HttpServletRequest) ac.get(StrutsStatics.HTTP_REQUEST); // 取出名为user的Session属性 String name = request.getParameter("name"); try{ System.out.println("得到的用户名是: "+name); }catch(Exception ex){ System.out.println("异常: "+ex.toString()); } // 如果没有登陆,或者登陆所用的用户名不是aaron,都返回重新登陆 if (name != null && name.equals("aaron")) { request.getSession().setAttribute("msg", "登录成功"); request.getSession().setAttribute("name", name); return invocation.invoke(); } //ctx.put("msg", "没有权限,重新登录"); request.getSession().setAttribute("msg", "没有权限,重新登录"); // 直接返回login的逻辑视图 return Action.LOGIN; } }
这里直接判断用户名是否符合要求。
PS:struts2 拦截器Interceptor中取得request: HttpServletRequest request = (HttpServletRequest) ac.get(StrutsStatics.HTTP_REQUEST);
配置struts.xml文件
<?xml version="1.0"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.i18n.reload" value="false" /> <constant name="struts.devMode" value="false" /> <package name="default" extends="struts-default" namespace="/"> <!-- 用户拦截器定义在该元素下 --> <interceptors> <!-- 定义了一个名为checkUserLogin的拦截器 --> <interceptor name="checkUserLogin" class="com.aaron.action.AuthorityInterceptor" /> <interceptor-stack name="checkUserLogin_stack"> <!-- 应用默认拦截器堆栈 一定要有 --> <interceptor-ref name="defaultStack" /> <!-- 应用自定义拦截器 --> <interceptor-ref name="checkUserLogin" /> </interceptor-stack> </interceptors> <!-- 定义默认拦截器 --> <default-interceptor-ref name="checkUserLogin" /> <!-- 定义全局处理结果 --> <global-results> <result name="login">login.jsp</result> </global-results> <action name="login" class="com.aaron.action.UserAction" method="login"> <result name="success">success.jsp</result> <result name="login">login.jsp</result> </action> </package> </struts>
测试
除了aaron用户名可以登录,输入其他用户名显示的都是“没有权限,重新登录”。