struts2 拦截器的使用

在struts2的工作原理博文中http://blog.csdn.net/u010412719/article/details/51193352,可以看到,拦截器是struts2的核心,所有复杂的功能都是由拦截器来完成,拦截器可以在Action和result执行之前之后进行一些处理。

下面将介绍如何定义和使用拦截器。

如何自定义一个拦截器?

有以下三个步骤:

1、先自定义一个继承AbstractInterceptor(或实现Interceptor接口)的类。Interceptor接口中有三个函数:init()/destory()/intercept().而AbstractInterceptor是实现了Interceptor接口,并对方法init()和destory()方法进行了空实现。因此,我们一般会选择继承AbstractInterceptor类,这样我们就只需要重写intercept()这一个方法。如果我们选择实现Interceptor接口,则需要重写上面提到的3个抽象方法。

2、在配置文件struts.xml文件中对拦截器进行注册

3、在需要使用的Action中引用我们自定义的拦截器。

上面的步骤比较清晰,下面我们举一个例子来对这三个步骤进行详细说明。

例子

例如:我们想实现这样一个功能,什么样的功能呢,就是我们想观察下我们的一个Action的执行时间有多长?

实现这样一个功能,就可以借助于自定义拦截器来完成。

第一步:自定义一个拦截器

代码中有一行代码需要注意下:

String result=invocation.invoke();

这行代码的作用就是:执行剩下其它的拦截器,如果此拦截器是最后一个,则执行Action。此方法的返回值就是Action执行完成之后返回的字符串,即将用于视图映射。

第二步:配置和引用第一步自定义的拦截器

配置拦截器如下:

<!-- 注册拦截器 --><interceptors><interceptor name="timerInterceptor" class="com.timer.intercept.TimerIntercept"></interceptor></interceptors>

在Action中引用拦截器如下:

<!--  引用拦截器 --><interceptor-ref name="timerInterceptor"></interceptor-ref>

如果我们自定义了自己的拦截器,struts2就不会为Action使用默认拦截器。如果我们在自定义了自己的拦截器后,也要将默认拦截器在Action进行引用。如下:

<interceptor-ref name="defaultStack"></interceptor-ref>

具体例子的struts.xml文件内容截图如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts><package name="default" namespace="/" extends="struts-default"><!-- 配置拦截器 --><interceptors><interceptor name="timerInterceptor" class="com.timer.intercept.TimerIntercept"></interceptor><interceptor-stack name="mystack"><interceptor-ref name="timerInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><action name="timer"><result >/result.jsp</result><interceptor-ref name="mystack"></interceptor-ref></action></package>
</struts>

以上我们就这样定义、配置和引用了一个拦截器。

注意:在给Action中引用多个拦截器,我们需要注意他们的顺序,因为这决定这这些拦截器的执行顺序。

关于拦截器,有一个拦截器栈的概念,拦截器栈就是多个拦截器的集合。当我们有多个拦截器时,我们就可以自定一个拦截器栈,并将所有即将在Action中引用的拦截器放入其中,最后,在需要引用的地方直接引用此栈即可。

开发权限验证拦截器实例

假设我们有这样一个需求:只有管理员admin能够进入后台管理系统,而其他人时不能够进入的,在后台管理系统由一系列的系统文件是只有进行后台管理系统之后才能看得到,不进行是看不到的。

因此这里就需要进行开发权限验证拦截器的帮助,才能实现。

第一步:建立一个登陆界面

登陆界面在前面介绍过,只涉及到一个表单的编写。

代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+
request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'login.jsp' starting page</title></head><body>${ loginError }  <!-- 返回错误登陆的信息给此界面  --><form action="loginAction.action" method="post">用户名:<input type="text" name="username"> <br/>密码:<input type="password" name="password"><br/><input type="submit" value="登陆"/></form></body>
</html>

第二个:创建一个Action类来接收输入参数

创建一个Action类来接收输入参数,并处理登陆请求。

代码如下:

import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport implements SessionAware{private String username;private String password;private Map<String,Object> session;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;}//用来处理登陆请求public String login(){if("admin".equals(username)&&"123".equals(password)){session.put("loginInfo", username);return SUCCESS;}else{session.put("loginError", "用户名或密码不正确");return ERROR;}}@Overridepublic void setSession(Map<String, Object> session) {this.session=session;}}

第三步:创建一个自定义拦截器

import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/** 自定义一个拦截器* */
public class LoginInterceptor extends AbstractInterceptor {@Overridepublic 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文件中,配置拦截器

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts><constant name="struts.enable.DynamicMethodInvocation" value="false"></constant><package name="default" namespace="/" extends="struts-default"><!-- 注册拦截器 --><interceptors><interceptor name="myInter" class="com.struts.intercept.LoginInterceptor"></interceptor><!-- 自定义一个拦截器栈,引用我们自定义的拦截器和默认的拦截器栈,这样在下面我们只需要在下面引用自定义的拦截器栈即可 --><interceptor-stack name="mystack"><interceptor-ref name="myInter"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack>        </interceptors><!-- 通过此Action返回内部页面,需要判断用户是否已登录,如果未登陆则跳转到登陆页面 --><action name="auth"><result>/WEB-INF/page/innerPage.jsp</result><result name="login">/login.jsp</result><interceptor-ref name="mystack"></interceptor-ref></action><!--  登陆action  ,如果用户成功登陆,则可以访问/WEB-INF/page/innerPage.jsp否则,返回login.jsp--><action name="loginAction"  method="login" class="com.struts.action.LoginAction">       <result>/WEB-INF/page/innerPage.jsp</result><result name="error">/login.jsp</result></action></package>
</struts> 

注释写的比较详细,这里就不再介绍。

测试记录

1、当我们打开浏览器,首次输入http://localhost:8080/AuthInterceptor/auth时,由于拦截器的作用,会返回到login.jsp页面

2、当我们在登陆界面,由于用户名或密码不正确,则会提示错误信息。如下:


3、当我们的用户名和密码均正确时,则访问到了内部页面。


4、当我们访问成功之后,再一次访问http://localhost:8080/AuthInterceptor/auth时,则由于Session中保存了之前的用户信息,因此,可以正常访问,这和我们在生活中的登陆比较类似,在我们刚刚登陆过退出之后,有的系统就可以直接进行登陆,而不是要求我们继续输出用户名和密码,但是有的系统却不是这样,例如银行系统,则当我们退出之后,则需要重新输入的。

小结

以上只是从自定义一个拦截器出发来简单的介绍了下如何使用拦截器。

参考资料

慕课网:《Struts2拦截器浅析》这个视频教程

《struts2拦截器的使用》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. Ubantu 16.04中文输入问题解疑
  2. JAVA入门笔记·我的第一个JAVA程序
  3. C++对C的加强之新增Bool类型关键字
  4. java 查看pdf_Java中实现pdf在线查看和下载
  5. 开源OSS.Social微信项目解析
  6. java多条件组合查询6_elasticsearch组合多条件查询实现restful api以及java代码实现
  7. ihtml2document能不能根据id获取dom_一段监视 DOM 的神奇代码
  8. python在材料模拟中的应用_材料模拟在计算机中使用的软件
  9. 省控线是什么意思,本科一批以及本科二批省控线是什么意思
  10. H3C配置PPP协议
  11. 10个高质量PPT模板下载网站
  12. 双系统切换后系统时间错乱问题解决
  13. 美国儿科学会育儿百科
  14. SendGrid -- Stressful Subject
  15. 关于云计算的一些概念理解
  16. 利用python进行数据分析(四)
  17. 单线程-多线程-高并发
  18. MT管理器 – 超强的手机文件管理器
  19. 记bilibili 2021 1024程序员节安全攻防挑战赛
  20. Simulink常用模块库(Integrator/Discrete-TimeIntegrator)

热门文章

  1. 我的世界java版声音来源_教程/声音目录 - Minecraft Wiki,最详细的官方我的世界百科...
  2. [转载]linux下的几个开源软件
  3. 左右连接中where和and的区别
  4. [GIS] 常见地图投影 - 投影坐标系 - UTM|高斯克吕格|兰勃特等角投影|墨卡托投影
  5. 分享几个省电小技巧 让你的mac电脑使用时间更长
  6. 一:Kafka快速实战与基本原理
  7. 燕千云 YQCloud 数智化业务服务平台 发布1.12版本
  8. 《麦肯锡方法》读书思维导图
  9. 免费资源_第三篇 竞赛(1)_Kaggle
  10. 2023年湖北武汉安全员ABC报名条件和报名资料是什么?全国通用?