一、认识拦截器

拦截器也是一个类

拦截器可以在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. PE渲染引擎 三

    加进了SSAO,讲真这个东西,很容易忽略他的存在.并且动态的话,会有闪烁. 下面两幅图,单独给你看一张,应该看不出去区别....依旧是浓重风格,这个tongmaping,哪位大神指教下.....

  2. eclipse中对项目进行分类管理

    我们在用Eclipse开发的时候通常会建很多类型的项目,如公司项目.自己项目.Demo等等,并且一个项目又可能有一个主项目和多个引用包,如果包所有的项目都放到一个workspace下面,则会引起混来, ...

  3. 受限玻尔兹曼机(RBM)学习笔记(六)对比散度算法

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

  4. Python单元测试框架之pytest -- fixtures

    fixtures不太好翻译,可看作是夹心饼干最外层的两片饼干.通常用setup/teardown来表示.它主要用来包裹测试用例,为什么需要这样的饼干呢?我们以web自动化测试为例,例如,要测试的某系统 ...

  5. Django--models表操作

    需求 models对表的增删改查 知识点 1.基础操作 1.1  增 方法一 1 models.Tb1.objects.create(c1='xx', c2='oo')  #增加一条数据 1 2 di ...

  6. 新手学习Cocoapods教程

    CocoaPods简介 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如AFNetWorking等等.手动去下载所需类库十分麻烦.另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下 ...

  7. JS 跨域问题常见的五种解决方式

    一.什么是跨域? 要理解跨域问题,就先理解好概念.跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来 ...

  8. 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum

    Sum Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=4704 Mean: 给定一个大整数N,求1到N中每个数的因式分解个数的 ...

  9. 重构第5天:提升字段(Pull Up Field)

    理解:提升字段和前面讲解的方法提公很类似,可以说方式都是一样的.就是把继承类中经常用到的字段,提出来 放到基类中,达到通用的目的.提高代码重用性和可维护性. 详解:如下重构前的代码: using Sy ...

  10. 【C#】OOP之多态那点事

    前言: 对菜鸟开发者的忠告:花一万个小时练习 Coding,不要浪费一万小时无谓地 Debugging(也就说看代码) 看上面的UML图,我们创建一个抽象的Instrument类,类中有一个抽象方法p ...