一、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. C# 控件拖动

    https://zhidao.baidu.com/question/2116834779399609987.html [DllImport("user32.dll", EntryP ...

  2. python中使用递归实现反转链表

    反转链表一般有两种实现方式,一种是循环,另外一种是递归,前几天做了一个作业,用到这东西了. 这里就做个记录,方便以后温习. 递归的方法: class Node: def __init__(self,i ...

  3. Python爬虫知识点二

    一.request库 import json import requests from io import BytesIO #显示各种函数相当于api # print(dir(requests)) u ...

  4. swift中的AnyHashable

    AnyHashable是调和objc和Swift的产物 典型的场景是,objc下无泛型的NSDictionary到了Swift下,会变成什么?(典型例子是苹果来的推送消息) [Any: Any],这肯 ...

  5. 冒泡算法给0~9随机n位数字排序

    <?php //产生5位0~9的随机数      function getRand($begin=0,$end=9,$limit=5){                $rand_array=r ...

  6. JavaScript(四)操作符

      6种表达式 原始表达是  初始化表达式 函数定义表达式 函数调用表达式 属性访问表达式 对象创建表达式 操作符 操作符的优先级 属性访问[] .  >  一元操作符 >  */ > ...

  7. 2.2 .this的绑定规则

    2.this的绑定规则 1.默认绑定 function foo( ) { console.log(this.a); } var a=1; foo(); 在代码中,foo()函数不带任何修饰的引用进行调 ...

  8. 从Unity中的Attribute到AOP(五)

    今天主要来讲一下Unity中带Menu的Attribute. 首先是AddComponentMenu.这是UnityEngine命名空间下的一个Attribute. 按照官方文档的说法,会在Compo ...

  9. faster-rcnn系列笔记(一)

    目录: 1. 序言 2.正文 2.1  关于ROI 2.2  关于RPN 2.3 关于anchor 3. 关于数据集合制作 4. 关于参数设置 5. 参考 1.序言 叽歪一下目标检测这个模型吧,这篇笔 ...

  10. C陷阱:求数组长度

    // 这是一篇导入进来的旧博客,可能有时效性问题. 程序中,当我们建立了一个int型数组:int a[]={1,2,3,4,5,6};随后我们可能需要知道它的长度,此时可以用这种方法:length = ...