struts2拦截器原理:

  当请求action时,struts2会查找配置文件,并根据配置实例化相对的 拦截器对象,然后串成一个列表,然后一个一个的调用列表中的拦截器。

  比如:某些页面必须登录才可以访问,可以在每个action执行处理逻辑之前先判断是否已登录,但这种做法不利于代码复用,所以将这些检查是否登录的代码放到拦截器中进行。

自定义拦截器:

  自定义拦截器首先要实现com.opensymphony.xwork2.interceptor.Interceptor接口,该接口有三个方法,init、destroy、intercept方法。

  init():在服务器启动时加载一次,并且只加载一次。

  destroy():当拦截器销毁时执行的方法。

  Interceptor():拦截器核心方法,其中有一个参数actionInvocation。

  actionInvocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器再返回给视图,也就是调用后面的action继续执行。

创建拦截器:

package com.struts2.web;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; //第一种创建方式 实现com.opensymphony.xwork2.interceptor.Interceptor接口
//拦截器生命周期:随着项目启动而创建,项目关闭而销毁
public class MyInterceptor implements Interceptor {
@Override
//初始化
public void init() { } @Override
//核心拦截方法
public String intercept(ActionInvocation actionInvocation) throws Exception {
return actionInvocation.invoke();
} @Override
//销毁
public void destroy() { }
}
package com.struts2.web;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; //第二种方式:继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类
public class MyInterceptor2 extends AbstractInterceptor {
@Override
//直接实现拦截方法
public String intercept(ActionInvocation actionInvocation) throws Exception {
return actionInvocation.invoke();
}
}
package com.struts2.web;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
//第三种方式:继承com.opensymphony.xwork2.interceptor.MethodFilterInterceptor类
public class MyInterceptor3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
//前处理
actionInvocation.invoke(); //放行
//后处理
return null;
}
}

第三种方式 MethodFilterInterceptor是继承了第二种方式的AbstractInterceptor类 第二种方式实现了第一种方式的Interceptor接口。

拦截器API

  放行:actionInvocation.invoke();

  前处理:放行前代码

  后处理:放行后代码

  不放行直接跳转到结果页面:return "success" 返回一个字符串,不执行后续的拦截器以及action。直接跳转到一个页面

拦截器配置

    <package name="inter" namespace="/" extends="struts-default">
<interceptors>
<!--注册拦截器-->
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<!--注册拦截器栈 -->
<interceptor-stack name="myStack">
<!--加入自定义的拦截器 -->
<interceptor-ref name="MyInterceptor3"></interceptor-ref>
<!--引用默认的拦截器栈(20个)-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!--指定包中的默认拦截器栈 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="Demo1Action" class="com.struts2.web.Demo1Action" method="execute">
<result name="success">/demo1.jsp</result>
</action>
</package>

此时执行包中的action就会走拦截器的前处理 放行到action处理 最后后处理

指定方法调用拦截器

修改demo1 为多个方法的

public class Demo1Action extends ActionSupport {
public String execute(){
System.out.println("Demo1 Action execute");
return SUCCESS;
}
public String register(){
System.out.println("Demo1 Action register");
return SUCCESS;
}
public String login(){
System.out.println("Demo1 Action login");
return SUCCESS;
}
}

修改配置文件支持动态方法

<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="MyInterceptor3"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<global-allowed-methods>execute,login,register</global-allowed-methods>
<action name="Demo1Action_*" class="com.struts2.web.Demo1Action" method="{1}">
<result name="success">/demo1.jsp</result>
</action>
</package>

此时访问三个方法都是走拦截器的,修改配置文件如下

<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="MyInterceptor3">
<!--指定哪些方法不拦截-->
<param name="excludeMethods">login,register</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<global-allowed-methods>execute,login,register</global-allowed-methods>
<action name="Demo1Action_*" class="com.struts2.web.Demo1Action" method="{1}">
<result name="success">/demo1.jsp</result>
</action>
</package>

然后访问 login、register都不走自定义的拦截器了 includeMethods 哪些拦截 excludeMethods哪些方法不拦截 只可设置一种

实现登陆拦截器

public class MyInterceptor3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception { Map<String, Object> session = ActionContext.getContext().getSession();
Object user = session.get("user");
//已登陆 放行
if(user != null){
return actionInvocation.invoke();
}else{
//没登陆 去登陆页面
return "toLogin";
}
}
}

全局配置结果集

<package name="inter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor3" class="com.struts2.web.MyInterceptor3"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="MyInterceptor3">
<param name="excludeMethods">login,register</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!--定义全局结果集 -->
<global-results>
<result name="toLogin" type="redirect">login.jsp</result>
</global-results>
<global-allowed-methods>execute,login,register</global-allowed-methods>
<action name="Demo1Action_*" class="com.struts2.web.Demo1Action" method="{1}">
<result name="success">/demo1.jsp</result>
</action>
</package>

登陆代码

ActionContext.getContext().getSession().put("user","name");

前台 访问execute 自动跳转到登陆页面 登陆后 在访问execute 正常

struts2拦截器(四)的更多相关文章

  1. Struts2 拦截器配置以及实现

    @(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...

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

    拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...

  3. (三)Struts2 拦截器

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:拦截器简介 (百度百科Struts2) Struts2 拦截器是在访问某 ...

  4. Struts2拦截器总结<转>

    由于项目中在登录跳转到其他应用程序模块的时候有用到拦截器,因此查看了一下相关资料. 原文地址:http://blog.csdn.net/sendfeng/article/details/4248120 ...

  5. Struts2拦截器配置实例

    拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 * 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链. * 责任链每一个节 ...

  6. struts2(五)之struts2拦截器与自定义拦截器

    前言 前面介绍了struts2的输入验证,如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了, 不过到后面应该都有其他更方便的校验方法,而 ...

  7. struts2拦截器interceptor的配置方法及使用

    转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2  NormalText Code  ...

  8. struts2 拦截器

    拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...

  9. Struts2拦截器的使用 (详解)

    Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...

随机推荐

  1. 数组题汇总(python3)

    题目主要来自<剑指offer>和LeetCode,用python3来写的代码. 1.二维数组的查找: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列 ...

  2. 二叉堆 及 大根堆的python实现

    Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子 ...

  3. HTML学习笔记之标签进阶

    目录 1.框架 2.表单 3.音频 4.视频 5.文档类型 6.头部元素 7.样式 8.脚本 9.实体 1.框架 使用框架允许我们在同一个浏览器窗口中显示多个页面,其中每份 HTML 文档称为一个框架 ...

  4. 24.通过ngram分词机制实现index-time搜索推荐

    一.ngram和index-time搜索推荐原理     1.什么是ngram     假设有一个单词:quick,在5种长度下的ngram情况如下: ngram length=1,q u i c k ...

  5. 学习记录--如何将exec执行结果放入变量中?

    declare @num int, ) set @sqls='select @a=count(*) from tb ' exec sp_executesql @sqls,N'@a int output ...

  6. hadoop在线重启namenode+在线扩展集群

    1.执行步骤 修改dfs.namenode.handler.count=150 () NameNode 有一个工作线程池用来处理客户端的远程过程调用及集群守护进程的调用.处理程序数量越多意味着要更大的 ...

  7. Html学习总结(2)——Html页面head标签元素的意义和应用场景

    相信在html5之前,很少人会关注html页面上head里标签元素的定义和应用场景,可能记得住的只有"title"."keyword"和"descri ...

  8. python基础 条件和循环

    Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  9. CentOS 6.5下mysql的安装与配置

    一.通过yum自动安装mysql yum install mysql-server my-client 二.初始化及相关配置 安装完mysql数据库以后,会发现会多出一个mysqld的服务,通过输入  ...

  10. N天学习一个linux命令之ssh

    用途 通过加密连接,远程登录主机和在远程主机执行命令,也可以用于转发x11和tcp,也可用于搭建VPN.第一次连接时,会弹出远程主机公钥指纹确认信息,通过这个方式防止中间人攻击. 用法 ssh [op ...