struts2拦截器

1. 拦截器

1.1 概述

ü 基本概念

Intercetor, 即为拦截器。

1) 在Struts2中,把每一个功能都用一个个的拦截器实现;用户想用struts的哪个功能的时候,可以自由组装使用。

2)Struts2中,为了方法用户对拦截器的引用,提供了拦截器栈的定义,里面可以包含多个拦截器。   文件夹(文件, 文件2)  拦截器栈(拦截器,拦截器2)

3)Struts2中,如果用户没有指定执行哪些拦截器,struts2有一个默认执行的栈,defaultStack;

 一旦如果用户有指定执行哪些拦截器,默认的拦截器栈就不会被执行

 

拦截器的设计,就是基于组件设计的应用!

ü 拦截器配置举例

 

struts-default.xml文件中,定义了struts提供的所有拦截器!


//1. 定义拦截器以及拦截器栈

<interceptors>

1.1 拦截器定义

<interceptor name="" class="" />

1.2 拦截器栈的定义

<interceptor-stack name="defaultStack">

引用了上面拦截器(1.1)

</interceptor-stack>

</interceptors>

2. 默认执行的拦截器(栈)

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

ü API

|-- Interceptor  拦截器接口

   |-- AbstractInterceptor  拦截器默认实现的抽象类; 一般用户只需要继承此类即可继续拦截器开发

 

|-- ActionInvocation 拦截器的执行状态,调用下一个拦截器或Action

 

 

拦截器与过滤器区别:

….

1.2 自定义一个拦截器案例

步骤:

1. 写拦截器类 (看生命周期)

2. 配置


/**

* 自定义拦截器

* @author Jie.Yuan

*

*/

public class HelloInterceptor implements Interceptor{

// 启动时候执行

public HelloInterceptor(){

System.out.println("创建了拦截器对象");

}

// 启动时候执行

@Override

public void init() {

System.out.println("执行了拦截器的初始化方法");

}

// 拦截器业务处理方法 (在访问action时候执行? 在execute之前执行?)

@Override

public String intercept(ActionInvocation invocation) throws Exception {

System.out.println("2. 拦截器,业务处理-开始");

// 调用下一个拦截器或执行Action  (相当于chain.doFilter(..)

// 获取的是: execute方法的返回值

String resultFlag = invocation.invoke();

System.out.println("4. 拦截器,业务处理-结束");

return resultFlag;

}

@Override

public void destroy() {

System.out.println("销毁....");

}

}


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<package name="hello" extends="struts-default">

<!-- 【拦截器配置】 -->

<interceptors>

<!-- 配置用户自定义的拦截器 -->

<interceptor name="helloInterceptor" class="cn.itcast.a_interceptor.HelloInterceptor"></interceptor>

<!-- 自定义一个栈: 要引用默认栈、自定义的拦截器 -->

<interceptor-stack name="helloStack">

<!-- 引用默认栈 (一定要放到第一行)-->

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

<!-- 引用自定义拦截器 -->

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

</interceptor-stack>

</interceptors>

<!-- 【执行拦截器】 -->

<default-interceptor-ref name="helloStack"></default-interceptor-ref>

<!-- Action配置 -->

<action name="hello" class="cn.itcast.a_interceptor.HelloAction">

<result name="success"></result>

</action>

</package>

</struts>

1.2 拦截器执行流程

启动:

创建所有拦截器、执行init()

访问:

先创建Action,

再执行拦截器,

最后:拦截器放行,执行execute();

1.3 拦截器案例

需求:

登陆后,显示列表!

案例准备:

Struts jar文件

DbUtils组件

数据库连接池/ 驱动包


--> login.jsp


<body>

<form method="post" action="${pageContext.request.contextPath }/user_login.action">

用户名:<input type="text" name="admin.userName"><br/>

密码:<input type="text" name="admin.pwd"><br/>

<input type="submit" value="登陆"><br/>

</form>

</body>


à UserAction.java


public class UserAction extends ActionSupport {

// ---------1. 封装请求数据-----------

private Admin admin;

public Admin getAdmin() {

return admin;

}

public void setAdmin(Admin admin) {

this.admin = admin;

}

// ---------2. 调用的Service-----------

private AdminService adminService = new AdminService();

// 登陆

public String login() {

try {

Admin userInfo = adminService.login(admin);

// 判断

if (userInfo == null){

// 登陆失败

return "input";

}

// 登陆成功:数据保存在session中

ActionContext.getContext().getSession().put("userInfo", userInfo);

// 登陆成功

return "loginSuccess";

} catch (Exception e) {

return ERROR;

}

}

// 列表

public String list() {

try {

// 查询全部

List<Admin> list = adminService.getAll();

// 保存到request

ActionContext.getContext().getContextMap().put("listAdmin", list);

return "list";

} catch (Exception e) {

return ERROR;

}

}

public String add() {

return null;

}

}


à list.jsp


<body>

<h1>欢迎你,${userInfo.userName }</h1>

<table align="center" border="1">

<tr>

<td>序号</td>

<td>编号</td>

<td>用户名</td>

<td>密码</td>

</tr>

<%--@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" --%>

<!-- 用struts标签迭代数据 -->

<%@taglib uri="/struts-tags" prefix="s" %>

<s:iterator var="admin" value="#request.listAdmin" status="st">

<tr>

<td>

<s:property value="#st.count"/>

</td>

<td>

<s:property value="#admin.id"/>

</td>

<td>

<s:property value="#admin.userName"/>

</td>

<td>

<s:property value="#admin.pwd"/>

</td>

</tr>

</s:iterator>

</table>

</body>


à 自定义拦截器


public class UserCheckInterceptor extends AbstractInterceptor{

/**

* 拦截器业务处理方法

*/

public String intercept(ActionInvocation invocation) throws Exception {

// 拿到当前执行的方法名:判断,只有当前方法名不是login,就进行验证

// 获取ActionContext对象

ActionContext ac = invocation.getInvocationContext();

// 获取action的代理对象

ActionProxy proxy = invocation.getProxy();

// 获取当前执行的方法名

String methodName = proxy.getMethod();

// 判断

if (!"login".equals(methodName)) {

// 先获取当前登陆的用户

Object obj = ac.getSession().get("userInfo");

if (obj == null) {

// 没有登陆

return "input";

} else {

// 当前用户有登陆

return invocation.invoke();

}

} else {

// 说明当前用户正在登陆

return invocation.invoke();

}

}

}


à 配置拦截器


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<package name="user" extends="struts-default">

<!-- 【拦截器配置】 -->

<interceptors>

<interceptor name="loginCheck" class="cn.itcast.interceptor.UserCheckInterceptor"></interceptor>

<interceptor-stack name="myStack">

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

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

</interceptor-stack>

</interceptors>

<!-- 【执行拦截器:第一种写法: 当前包下所有的acntion都执行myStack栈】

<default-interceptor-ref name="myStack"></default-interceptor-ref>

-->

<!-- 全局配置 -->

<global-results>

<result name="error">/error.jsp</result>

</global-results>

<action name="user_*" class="cn.itcast.action.UserAction" method="{1}">

<!--第二种写法: 只是在这一个Action中执行myStack栈

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

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

-->

<!-- 第三种写法:执行用户栈(与第二种写法一样, 只在当前aciton中执行自定义栈) -->

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

<!-- 1. 登陆失败 -->

<result name="input">/login.jsp</result>

<!-- 2. 登陆成功 -->

<result name="loginSuccess" type="redirectAction">user_list</result>

<!-- 3. 列表展示 -->

<result name="list">/WEB-INF/list.jsp</result>

</action>

</package>

</struts>

 
时间: 2024-12-24 09:45:29

struts2拦截器的相关文章

Struts2拦截器概述

--------------------siwuxie095 Struts2 拦截器概述 1.Struts2 框架封装的很多功能都在 Struts2 的拦截器中 2.Struts2 框架中有很多拦截器,但这些拦截器不是每次 都执行,只有默认拦截器才会每次都执行 3.Struts2 默认拦截器的位置 「注意:默认拦截器中也有很多拦截器」 4.拦截器的执行 在 Action 对象创建之后,在 Action 方法执行之前 [made by siwuxie095]

笔记:Struts2 拦截器

配置拦截器 Struts.xml 配置文件中,使用<interceptor-/>来定义拦截器,有属性 name 表示拦截器的名称,class 表示拦截器的具体首先类,可以使用<param-/>子元素来配置拦截器的参数,配置示例: <package name="包名称" extends="抽象包名称"> <interceptors> <interceptor name="拦截器名称" class

Struts2 拦截器与Spring AOP的区别

在学习Spring AOP技术的同时,发现其实与以前做过的拦截器的功能很类似,于是开始抱着这两者之间有什么关系的问题进行深入研究. 我们知道struts2使用拦截器主要是用来处理用户的请求,OGNL的使用,表单验证 等. 而spring的拦截器,主要体现在AOP的事务管理方面,还有比如一些错误或者异常的日志的显示 也是通过配置spring的log拦截器来实现的. Struts的拦截器是针对Struts的,比如SSH项目都会去使用AOP ,如果是单纯的STRUTS项目 自然使用Struts本身的拦

【SSH2(实践篇)】--Struts2拦截器精解

上篇博客对Struts2的体系结构做了初步的了解,Struts2是以WebWork作为处理核心,并采用拦截器的机制来处理用户的请求,同时它还集成了Struts1丰富的标签库.另外上篇博客还对Struts2的配置使用进行了初步的介绍,下面将会集中讨论Struts2的拦截器. 一.拦截器 1.拦截器小介 拦截器的功能类似于web.xml文件中的Filter,能对用户的请求进行拦截,通过拦截用户的请求来实现对页面的控制.拦截器是在Struts-core-2.2.3.jar中进行配置的,原始的拦截器是在

Struts2 拦截器

一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故将这些权

Struts2拦截器的使用 (详解)

这位仁兄的写的不错,我照抄过来了:http://www.blogjava.net/i369/articles/162407.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):<interceptor-ref name="checkbox">  <param name=&q

Struts2拦截器详解

作者:禅楼望月 1. Struts2内置拦截器 Struts2内置了大量的拦截器,如下图: 图片来自:刘水镜的博客:菜鸟学SSH(四)--Struts2拦截器 这些拦截器以name-class的形式配置在struts-default.xml中: <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> <interceptor n

转载 - Struts2 拦截器详细配置过程

出处:http://www.blogjava.net/zzzlyr/archive/2009/10/12/297998.html Struts2 拦截器详细配置过程 1:所有拦截器的超级接口Interceptor ,Action去实现这个接口; Interceptor 它其中有三个方法(init(),destroy() ,interceptor()): Init()方法:在服务器起动的时候加载一次,并且只加载一次; Destroy()方法:当拦截器销毁时执行的方法; Interceptor()方

Struts2拦截器总结&lt;转&gt;

由于项目中在登录跳转到其他应用程序模块的时候有用到拦截器,因此查看了一下相关资料. 原文地址:http://blog.csdn.net/sendfeng/article/details/4248120 Struts2拦截器总结: 一.编写拦截器 1.  实现接口com.opensymphony.xwork2.Intercepter(或继承com.opensymphony.xwork2.AbstractInterceptor) 2.  在interceptor方法中加入如下代码: public S

浅谈Struts2拦截器的原理与实现

拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可重用的部分的方式,很多业务逻辑都是靠拦截实现的,比如校验,验证登录权限(比如下载时跳转到登陆页面)等等.     过滤器是对整个的请求过程起作用!换句话说就是拦截器没有过滤器的范围广.过滤器是在java web中,你传入的request,response提前过滤掉一些信息