一、认识拦截器

拦截器也是一个类

拦截器可以在Action被调用之前和之后执行代码

框架很多核心功能是拦截器实现的

拦截器的特点:

拦截器自由组合,增强了灵活性、扩展性、有利于系统解耦

拦截器可以拦截Action请求

在访问的Action执行之前和执行之后执行代码实现某项功能

Struts2:

大部分功能是在拦截器中实现的如:接收输入的参数,数据验证,文件上传,国际化等

应用程序:

需要在Action执行的前后执行特定功能

Action执行时间统计,Action访问权限管理

Action添加功能,Action代码不动使用拦截器实现功能

二、拦截器工作方式

三、自带的一些拦截器

Struts2还有很多拦截器。

四、拦截器栈

从结构上 :拦截器栈就是一组拦截器

从功能上:拦截器栈也是拦截器

五、默认拦截器

六、计算运行Action的时间

MyTimerInterceptor

package com.pb.web.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyTimerInterceptor extends AbstractInterceptor { //实现父类的方法
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//执行前的时间
long startTime=System.currentTimeMillis();
System.out.println("执行Action之前的工作,开始时间:"+startTime + " ms");
//执行这个拦截器之后的拦截器或者Action
String result=invocation.invoke();
//获取执行结束的时间 执行Action之后的工作:计算并输出执行时间
long endTime=System.currentTimeMillis();
//执行时间差
long execTime=endTime-startTime; System.out.println("执行Action之后的工作,结束时间:"+endTime+",执行耗时:" + execTime + " ms"); return result;
} }

struts.xml

<?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>
<!-- 禁用动态方法调用-->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- 启用开发模式后,更改设置不用重启Tomcat-->
<constant name="struts.devMode" value="true" />
<!-- 包默认继承strus-default -->
<package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="myTimer" class="com.pb.web.interceptor.MyTimerInterceptor"></interceptor>
</interceptors>
<action name="hello" class="com.pb.web.action.HelloAction" method="hello">
<result name="success">/index.jsp</result>
<result name="input">/index.jsp</result>
<result name="error">/index.jsp</result>
<!-- 启用自定义的拦截器-->
<interceptor-ref name="myTimer"/>
<!-- 同时启用struts2默认的拦截器名称为defaultStack -->
<interceptor-ref name="defaultStack"/>
</action>
</package>
</struts>

七、自定义拦截器

 struts2有三种方法自定义拦截器

  • 实现interceptor接口
  • 继承AbstractInterceptor类
  • 继承MethodFilterInterceptor类

八、简单例子实现登录后某个页面才能访问

登录后才能访问/WEB-INF/page/security.jsp

实体类

package com.pb.entity;
/*
* 用户类
*/
public class User {
private String username;
private String password; 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;
} }
package com.pb.web.action;

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User; public class LoginAction extends ActionSupport implements SessionAware {
private User user;
private Map<String, Object> session;
//登录
public String login(){
if("admin".equals(user.getUsername())&&"admin".equals(user.getPassword())){
session.put("user", user);
return SUCCESS;
}
return ERROR;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
@Override
public void setSession(Map<String, Object> session) {
this.session=session; }
public Map<String, Object> getSession() {
return session;
} }

拦截器

package com.pb.web.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.pb.entity.User; public class MyInterceptor extends AbstractInterceptor { @Override
public String intercept(ActionInvocation invocation) throws Exception {
Map<String, Object> session=ActionContext.getContext().getSession();
//获取session中保持的用户信息
User user=(User) session.get("user");
if(user!=null){
//如果用户已经登录,继续执行剩余的拦截器和Action
return invocation.invoke();
}else{
//如果用户尚未登录,返回到登录页面
return Action.LOGIN;
} } }

struts.xml

<?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="default" namespace="/" extends="struts-default">
<interceptors>
<!--定义权限验证拦截器 -->
<interceptor name="myInterceptor" class="com.pb.web.interceptor.MyInterceptor"></interceptor>
<!--定义拦截器栈 -->
<interceptor-stack name="myStack">
<!--使用默认的拦截器 -->
<interceptor-ref name="defaultStack" />
<interceptor-ref name="myInterceptor" />
</interceptor-stack>
</interceptors>
<!-- 定义全局结果返回login时,返回登录页面-->
<global-results>
<!--以重定向的方式跳转 -->
<result name="login" type="redirect">/login.jsp</result>
</global-results>
<!-- action-->
<action name="login" class="com.pb.web.action.LoginAction" method="login">
<!-- 结果判断和页面跳转-->
<result name="success">/loginSuccess.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="security">
<interceptor-ref name="myStack" />
<result name="success">
/WEB-INF/page/security.jsp
</result> </action>
</package>
</struts>

九、拦截器使用和与过滤器的不同之处

与过滤器的相同之处:

  • 功能相似
  • 原理相似
  • 方法相似

与过滤器的不同之处:

  • 拦截器用于拦截Action请求,而过滤器几乎可以过滤所有的请求
  • 拦截器中可以获取Action的当前执行状态,而过滤器不可以
  • 过滤器是Servlet中概念,在Web.xml中配置;拦截器是Struts2/Webwork中的概念在struts.xml中配置

Struts2(十四)拦截器实现权限管理的更多相关文章

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

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

  2. 十五、struts2中的拦截器(框架功能核心)

    十五.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 功能是一回事. 过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面 ...

  3. 框架学习之Struts2(四)---拦截器和标签

    一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...

  4. Struts2 (四) — 拦截器

    一.拦截器 1.概述 1.1什么是拦截器 ​ 在struts2中,拦截器(Interceptor)是用来动态拦截Action执行的对象. ​ 拦截器有点类似以前Servlet阶段的Filter(过滤器 ...

  5. Struts2知识点小结(四)--拦截器与注解开发

    一.Struts2的拦截器(interceptor) 作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强.权限控制),需要拦截器组件 1.str ...

  6. struts2中的拦截器

    一  AOP思想: 面向切面编程的思想 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP ...

  7. Struts2的核心——拦截器

    虽然以前已经学了很多的拦截器,但是在这里还是想重头梳理一下所有有关拦截器的知识,尤其是struts2中的拦截器 1:拦截器是什么? java里的拦截器是动态拦截Action调用的对象.它提供了一种机制 ...

  8. [原]Jenkins(十四)---jenkins示例:admin管理所有项目,新建用户只能看部分项目

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horiz ...

  9. java struts2入门学习---拦截器学习

    一.拦截器,拦截器栈 1.拦截器的作用 拦截器本质上和servlet的过滤器是一样的.在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦 ...

随机推荐

  1. 比较HTML元素和Native组件的区别

    我们开发web应用,会使用到各种Html基本元素,比较<div>,<span>,<img>等. 当我们在开发React Native时,我们不能使用HTML元素,但 ...

  2. 受限玻尔兹曼机(RBM)学习笔记(二)网络结构

      去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...

  3. Android学习笔记之ConnectivityManager+NetWorkInfo

    PS:眼看就要开学了,该收收心了. 学习内容: 1.ConnecivityManager 2.NetWorkInfo   ConnectivityManger:网络连接管理者,用于管理Android设 ...

  4. Enum Helper

    public static class EnumHelper { #region get /// <summary> /// 获得枚举类型所包含的全部项的列表 /// </summa ...

  5. 【转】Python中的GIL、多进程和多线程

    转自:http://lesliezhu.github.io/public/2015-04-20-python-multi-process-thread.html 目录 1. GIL(Global In ...

  6. Sprint总结和第八九十的读书笔记

    总结:经过这次的Sprint,我在从中收获了很多.作为产品负责人的我,主要责任就是合理分配任务给自己的队友,调动队友的积极性.虽然这其中也有些不尽人意的地方,但是我们都坚持的走了过来,团队合作真的很重 ...

  7. AC自动机 - 关于Fail指针

    fail指针可以说是AC自动机里最难理解的东西,怎样更好的理解AC自动机的fail指针? 先来看一幅图: 看这幅图上的fail指针是怎么构造的. 树上的词分别是: { he , hers , his ...

  8. 从P6 EPPM 8 R3 到P6 EPPM 16 R1 有哪些改变?

    Product 特征 First Release for Feature P6 EPPM 通过编辑活动标识替换关系.当你需要修改一个关系,你不需要删除现有的关系,并作出一个新的,你可以简单地编辑活动的 ...

  9. IOS 之 PJSIP 笔记(二) iPJSUA 的简单使用

    上一篇在编译完之后,就很不负责的结束了,本篇就对 PJSIP 库中提供的一个示例 iPJSUA 的使用,做一个简单的介绍.也能解除很多人对官方文档的一个困扰,起码我是被困扰过了. 首先,要确保你的 P ...

  10. AEAI Portal V3.5.2门户集成平台发版说明

    AEAI Portal门户集成平台为数通畅联的核心产品,本着分享传递的理念,数通畅联将Portal_server.Portal_portlet两个项目开源,目的在于满足客户与伙伴的OEM需求,以及为广 ...