一、认识拦截器

拦截器也是一个类

拦截器可以在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. 爆料喽!!!开源日志库Logger的使用秘籍

    日志对于开发来说是非常重要的,不管是调试数据查看.bug问题追踪定位.数据信息收集统计,日常工作运行维护等等,都大量的使用到.今天介绍著名开源日志库Logger的使用,库的地址:https://git ...

  2. LuaInterface简介

    Lua是一种很好的扩展性语言,Lua解释器被设计成一个很容易嵌入到宿主程序的库.LuaInterface则用于实现Lua和CLR的混合编程. (一)Lua from the CLR 测试环境:在VS2 ...

  3. codeforces George and Job

    /* 题意:给一个长度为n的序列, 从中选择长度为m的k个区间(任意两个区间不会有公共部分) 使得所选择的区间的和最大! 思路:这是一种很常见的dp dp[i][j] 表示的是前 i 个数选择 j 个 ...

  4. sqlserver -- 学习笔记(三)解决php连接sqlserver2005视图时显示“异类查询要求为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项”的问题

    --php5.2 --sqlserver2005 php连接sqlserver的视图aa,语句如下: $query = mssql_query("select * from dbo.aa&q ...

  5. 【转载】取消Debian系统自动锁屏

    Linux的自动锁屏功能,会在你离开屏幕的两分钟,甚至更短的时候内,将屏幕锁住,需要输入密码才能进入Linux系统. 可按下图设置,关掉Linux自动锁屏功能 System-->Preferen ...

  6. UWP开发入门(十四)—— UserControl中Adaptive UI的小技巧

    本篇我们通过绘制一个非常简单的UserControl控件,来分享一下对Adaptive UI的理解及一些图形绘制的技巧. 现在流行的APP都少不了精致的用户头像,首先假设我们需要绘制如下的图形作为默认 ...

  7. 我理解的Android加载器

    Android的加载器(loader)是从Android 3.0开始出来的东西.要理解这里需要先理解为什么会出现加载器(也有地方把它说成是装载器)呢? 如果没有加载器... 首先Activity是我们 ...

  8. 我写的一个ExcelHelper通用类,可用于读取或生成数据

    读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三 ...

  9. 关于 getWriter() has already been called for this response 的错误解决办法

    java.lang.IllegalStateException: getWriter() has already been called for this response 今天在做显示图片的时候,( ...

  10. SpringMVC从Controller跳转到另一个Controller(转)

    http://blog.csdn.net/jackpk/article/details/44117603 [PK亲测] 能正常跳转的写法如下: return "forward:aaaa/bb ...