Struts2(十四)拦截器实现权限管理
一、认识拦截器
拦截器也是一个类
拦截器可以在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(十四)拦截器实现权限管理的更多相关文章
- Struts2使用拦截器完成权限控制示例
http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求: 要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...
- 十五、struts2中的拦截器(框架功能核心)
十五.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 功能是一回事. 过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面 ...
- 框架学习之Struts2(四)---拦截器和标签
一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...
- Struts2 (四) — 拦截器
一.拦截器 1.概述 1.1什么是拦截器 在struts2中,拦截器(Interceptor)是用来动态拦截Action执行的对象. 拦截器有点类似以前Servlet阶段的Filter(过滤器 ...
- Struts2知识点小结(四)--拦截器与注解开发
一.Struts2的拦截器(interceptor) 作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强.权限控制),需要拦截器组件 1.str ...
- struts2中的拦截器
一 AOP思想: 面向切面编程的思想 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP ...
- Struts2的核心——拦截器
虽然以前已经学了很多的拦截器,但是在这里还是想重头梳理一下所有有关拦截器的知识,尤其是struts2中的拦截器 1:拦截器是什么? java里的拦截器是动态拦截Action调用的对象.它提供了一种机制 ...
- [原]Jenkins(十四)---jenkins示例:admin管理所有项目,新建用户只能看部分项目
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horiz ...
- java struts2入门学习---拦截器学习
一.拦截器,拦截器栈 1.拦截器的作用 拦截器本质上和servlet的过滤器是一样的.在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦 ...
随机推荐
- Raspberry Pi 3 Model B 安装 OSMC
Raspberry Pi 3 Model B 自身搭载 WIFI 芯片,可直接连接无线网络. 准备 NOOBS 你可以购买预装有 NOOBS 的 SD 卡,或者从树莓派官网 下载 NOOBS.zip ...
- 【转】在Eclipse里查看Java字节码
要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调 ...
- WPF中模板选择和DataContext的一些使用
如图样: View结构 MainView(MainViewModel)|---Guide1View(Guide1ViewModel)|---Guide2View(Guide2ViewModel) |- ...
- B2B多商铺初期权限数据库设计
项目从无到有,两个月了.一期完成. 权限目前还很简单.USER表,ROLE表,RESOURCE表三个. 目前只有两个商铺.id是0的是我们自己,作为后台运维管理,也抽象成一个商铺,id为0.另一个商铺 ...
- Knockout 新版应用开发教程之"visible"绑定
"visible" 绑定 用途 DOM元素的显示或者隐藏是根据绑定的值来的,前提是将visible绑定给该元素 例子 <div data-bind="visible ...
- 爬虫技术 -- 基础学习(五)解决页面编码识别(附c#代码)
实现从Web网页提取文本之前,首先要识别网页的编码,有时候还需要进一步识别网页所使用的语言.因为同一种编码可能对应多种语言,例如UTF-8编码可能对应英文或中文等语言. 识别编码整体流程如下: (1) ...
- [Python] Search navigation in Pycharm
From: http://blog.csdn.net/u013088062/article/details/50323393 From: http://blog.csdn.net/u013088062 ...
- Windows Azure Web Site (17) 设置Web App TimeOut时间
<Windows Azure Platform 系列文章目录> 我们在开发Azure Web App的时候,如果页面加载时间过长,可能需要设置Time Out时间. 在这里笔者简单介绍一下 ...
- js-对象-2
对象: 对象是一组具有属性和方法的经过组织的数据. 默认对象: 日期对象:(日期基线:1970年1月1日00:00:00) 建立日期对象(实例): 格式:日期对象名称=new Date([日期参数]) ...
- jdbc中的细节
JDBC 架构:JDBC 的 API 支持两层和三层处理模式进行数据库的访问,但是一般的JDBC架构由两层处理模式组成.(1)JDBC API:提供了应用程序对 JDBC 管理器的连接(2)JDBC ...