一、Struts2拦截器原理

Struts2拦截器的实现原理相对简单,使用了aop思想和责任链模式,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。

1).aop思想:面向切面编程(在不修改源代码的情况下进行功能的扩展)。

2).责任链模式:执行多个拦截器,一个一个的进行执行,在执行完后进入下一个拦截器之前,前一个的拦截器会做类似于放行的操作。

二、Struts2 拦截器接口实现:

Struts2规定用户自定义拦截器需要实现Interceptor接口。该接口声明了3个方法:

package com.action;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; public class MyInterceptor implements Interceptor{ //结束:当拦截器销毁时执行的方法;
@Override
public void destroy() { } //初始化 :在服务器起动的时候加载一次,并且只加载一次;
@Override
public void init() { } //放行 :如果满足要求继续往下执行调用invoke方法,否则自定义返回信息
@Override
public String intercept(ActionInvocation arg0) throws Exception {
//是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图,也就是调用后面的action继续执行。
arg0.invoke();
return null;
} }

但是,这个接口需要实现三个方法,其中的init().destroy()是系统默认执行的,我们不需要管它,所以,在我们写拦截器的时候,还可以选择继承MethodFilterInterceptor类:

package com.zking.interceptor;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; public class LoginInterceptor extends MethodFilterInterceptor{ @Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
//拦截器所需要执行的业务逻辑
HttpServletRequest request=ServletActionContext.getRequest();
String name=(String)request.getSession().getAttribute("login");
if(name!=null){
//成功则继续执行
actionInvocation.invoke();
return Action.SUCCESS;
}
else{
//失败则返回信息给struts.xml
return Action.ERROR;
}
} }

三、struts.xml拦截器详细配置:

3):系统默认拦截器

2):自定义拦截器

详细配置文件如下:

<?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="mypackage" extends="struts-default">
<action name="login" class="com.action.LoginAction">
<!-- 配置令牌 -->
<interceptor-ref name="token"></interceptor-ref>
<!-- 引入默认的拦截器 默认的拦截器会帮你把action转换到action类中 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/success.jsp</result>
<!-- 当在session中已经找到相同的值得时候,进行跳转 -->
<result name="invalid.token">/error.jsp</result>
</action>
</package> <!-- 自定义拦截器 --> <package name="mylogin" extends="struts-default">
<!-- 创建拦截器 -->
<interceptors>
<interceptor name="MyInterceptor" class="com.zking.interceptor.MyInterceptor"></interceptor>
</interceptors>
<action name="userlogin" class="com.action.LoginActionInterceptor"
method="login">
<!-- 引用拦截器 -->
<interceptor-ref name="MyInterceptor">
<param name="excludeMethods">login</param>
</interceptor-ref>
<result name="success">/success.jsp</result>
<result name="login">/loginInterceptor.jsp</result>
</action>
</package>

3).自定义拦截器设置不被拦截的方法:

Struts2 05---拦截器的更多相关文章

  1. struts2总结六: Struts2的拦截器

    一.Struts2的系统结构图

  2. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  3. Struts2使用拦截器完成权限控制示例

    http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求:    要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...

  4. Struts2自定义拦截器Interceptor以及拦截器登录实例

    1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...

  5. struts2之拦截器

    1. 为什么需要拦截器 早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足.可扩展性降低, Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于 ...

  6. 初学者易上手的SSH-struts2 05拦截器与自定义拦截器

    因为自己对于struts2也不是很了解,这章将是struts2的最后一章了.那么这一章主要介绍的是拦截器以及怎么样来自定义一个拦截器. struts2的拦截器位于struts2-core(核心包)-& ...

  7. Struts2【拦截器】就是这么简单

    什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Str ...

  8. 【struts2】拦截器基础

    1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Strut ...

  9. JavaWeb框架_Struts2_(三)---->Struts2的拦截器

    2. Struts2的拦截器(使用拦截器实现权限控制) 2.1 拦截器的概述 拦截器是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器.Struts ...

  10. (转)Struts2的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/68648101 Struts2的拦截器 拦截器的概述 拦截器,在AOP(Aspect-Orien ...

随机推荐

  1. 01-Java基础及面向对象

    JAVA基础知识 Java 是SUN(Stanford University Network,斯坦福大学网络公司)1995年推出的一门面向 Internet 的高级编程语言. Java 虚拟机(JVM ...

  2. Class StatusesTableSeeder does not exist 如何解决

    Class StatusesTableSeeder does not exist错误如何解决 Laravel 5.* 执行seeder命令出现错误的解决方法     最近在使用Laravel开发一个项 ...

  3. 关于linux下的date日期,并以日期给文件命名

    在linux的终端中,我们输入date后会有以下显示: 然后博主也扩展了一下date的基础用法: date + "%-": %y 输出年份的后2位:%Y 输出完整年份 %m 输出月 ...

  4. .net打印控件基本用法

    1.在winform上加如下控件 2.代码和用法如下: using System; using System.Collections.Generic; using System.ComponentMo ...

  5. RedHat7下PostGIS源码安装

    本文介绍在RedHat7环境下安装使用PostGIS的流程. 1. PostgreSQL 1.1 yum安装PostgreSQL 这个比较简单,直接使用yum安装即可. $ sudo yum inst ...

  6. Ajax提交Form表单的一种方法

    待提交的表单 <form id="updatePublicKey" enctype="multipart/form-data"> <div c ...

  7. Haproxy原理(1)

    一.四层和七层负载均衡的区别 所谓的四层就是ISO参考模型中的第四层.四层负载均衡也称为四层交换机,它主要是通过分析IP层及TCP/UDP层的流量实现的基于IP加端口的负载均衡.常见的基于四层的负载均 ...

  8. 谈谈关键字new

    1.在情人节那天,无意间看到空间有人说,没有对象就new一个,然后就可以........ 程序中我们常用到X a=new X(), new在这里是创建一个对象,也可以叫做创建一个实例,我们先谈谈后半部 ...

  9. 论python3下“多态”与“继承”中坑

    1.背景: 近日切换到python3后,发现python3在多态处理上,有一些比较有意思的情况,特别记载,供大家参考... 以廖老师的python3教程中的animal 和dog的继承一节的代码做例子 ...

  10. Mac 安装 Gradle

    首先下载 Gradle 通过官网进行下载 https://gradle.org 下载的文件名可能是 gradle-3.3-bin.zip 解压 将此文件解压到任意位置,如解压到 /usr/local ...