Struts2拦截器
来源:互联网 发布:避孕套用途知乎 编辑:程序博客网 时间:2024/06/05 07:39
Struts2拦截器
Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能。
拦截器方法在Action执行之前或者之后执行。
拦截器工作原理
拦截器的执行过程是一个递归的过程
自定义拦截器
自定义拦截器主要有两种方式:
- 实现Interceptor接口
- 继承抽象拦截器类AbstractInterceptor
实现Interceptor接口
Interceptor接口中定义了三个方法
- init(): 在拦截器执行之前调用init()方法,主要用于初始化系统资源
- destroy(): 在拦截器实例被销毁之前,系统将会调用该方法来释放和拦截器相关的资源
- intercept(): 拦截器的核心方法
AbstractInterceptor
步骤:
- 创建一个继承自AbstractInterceptor的类
- 实现intercept方法
- 在struts.xml中配置
下面已一个例子来说明,该例子,是计算调用Action所话费的时间
如下,一个<a>
标签,来调用对相应的action。
<a href="timer">访问Action并计算执行Action花费的时间</a>
创建一个拦截TimerInterceptor
package com.imooc.interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;/* * 计算执行Action话费的时间 */public class TimerInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { //执行Action之前 long start = System.currentTimeMillis(); //执行下一个拦截器,如果是最后一个拦截器,则执行目标Action String result = invocation.invoke(); //执行Action之后 long end = System.currentTimeMillis(); System.out.println("执行Action花费时间:"+(end-start)+"ms"); return result; }}
在struts.xml中配置:
<struts> <package name="default" namespace="/" extends="struts-default"> <!-- 注册拦截器 --> <interceptors> <interceptor name="mytimer" class="com.imooc.interceptor.TimerInterceptor"></interceptor> </interceptors> <action name="timer" class="com.imooc.action.TimerAction"> <result>/success.jsp</result> <!-- 引用拦截器 --> <interceptor-ref name="mytimer"></interceptor-ref> </action> </package></struts>
Struts2内置拦截器
<action name="timer" class="com.imooc.action.TimerAction"> <result>/success.jsp</result> <!-- 引入默认的拦截器栈--> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 引用拦截器 --> <interceptor-ref name="mytimer"></interceptor-ref> </action>
- params拦截器 - 负责将请求参数设置为Action属性
- staticParams拦截器 - 将配置文件中action元素的子元素param参数设置为Action属性
- servletConfig拦截器 - 将源于Servlet API的各种对象注入到Action,必须实现对应接口
- fileUpload拦截器 - 对文件上传提供支持,将文件和元数据设置为对应的Action属性
- exception拦截器 - 捕获异常,并且将异常映射到用户自定义的错误页面
- validation拦截器 - 调用验证框架进行数据验证
例子
开发权限验证拦截器
主要功能是已登录用户可以访问管理页面,未登录用户则不能访问管理页面。
登录页面login.jsp
<h2>用户登录</h2><!-- 错误提示 -->${loginError} <form action="login.action" method="post"> 用户名:<input type="text" name="username"><br/> 密 码:<input type="password" name="password"><br/> <input type="submit" value="登录"> </form>
创建LoginAction,使用session保存用户名
package com.imooc.action;import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport implements SessionAware { private String username; private String password; private Map<String, Object> session; @Override public void setSession(Map<String, Object> session) { this.session = session; } //处理登录请求 public String login() { if ("admin".equals(username) && "123".equals(password)) { session.put("loginInfo", username); return SUCCESS; }else{ session.put("loginError", "用户名或密码不正确"); return ERROR; } } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
创建权限拦截器AuthInterceptor
package com.imooc.interceptor;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class AuthInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { ActionContext context = ActionContext.getContext(); Map<String, Object> session = context.getSession(); if (session.get("loginInfo") != null) { String result = invocation.invoke(); return result; }else{ return "login"; } }}
在struts.xml中配置信息如下:
<struts> <package name="default" namespace="/" extends="struts-default"> <!-- 注册拦截器 --> <interceptors> <interceptor name="auth" class="com.imooc.interceptor.AuthInterceptor"></interceptor> <!-- 自定义拦截器栈myStack,组合了defaultStack和auth --> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="auth"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 通过此Action访问后台管理页面,需要判断用户是否已登录 如果未登录,则返回登录视图 --> <action name="auth"> <result>/WEB-INF/page/manager.jsp</result> <result name="login">/login.jsp</result> <!-- 引用自定义的拦截器栈 --> <interceptor-ref name="myStack"></interceptor-ref> </action> <action name="login" class="com.imooc.action.LoginAction" method="login"> <result>/WEB-INF/page/manager.jsp</result> <result name="error">/login.jsp</result> </action> </package></struts>
SessionAwared的用法,参考:
- Sessions in struts2 application
- How to use sessions with Struts 2
0 0
- 【Struts2】Struts2中拦截器
- struts2拦截器
- Struts2拦截器
- struts2.0拦截器
- struts2.0 拦截器
- struts2拦截器学习
- struts2 拦截器
- Struts2拦截器(Interceptor)
- struts2.0拦截器
- 用上struts2拦截器
- struts2拦截器简介
- Struts2:拦截器概述
- Struts2拦截器(Interceptor)
- struts2 拦截器
- 关于struts2拦截器
- Struts2的拦截器
- struts2拦截器
- Struts2拦截器总结
- Ext JS4 架构你的应用 第3节 (官方文档翻译)
- js里面的单引号和双引号的区别
- mysql导入导出sql文件
- SSL证书(HTTPS)背后的加密算法
- srping框架中注解之总结列表:持续更新
- Struts2拦截器
- wamp下安装phpredis扩展
- Notification 通知栏的使用
- 课程练习三-1014-problem N
- 红帽64位下修改mysql 5.1密码
- Hadoop使用jar运行实例
- HDU 2015 偶数求和
- volatile与synchronized在Java单例模式中的应用
- 出现警告:implicit declaration of function