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前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦 ...
随机推荐
- mysql 行转列
SELECTREPLACE(GROUP_CONCAT(IF(ItemID=1101,ItemValue,"")),',',"") AS 'Item1101',R ...
- LDPC编译码基本原理
LDPC编译码基本原理 学习笔记 V1.1 2015/02/18 LDPC编译码基本原理 概述 本文是个人针对LDPC的学习笔记,主要针对LDPC译码算法做了简要的总结.该版本主要致力 ...
- DDD:订单管理 之 如何组织代码
背景 系统开发最难的是职责的合理分配,或者叫:“如何合理的组织代码”,今天说一个关于这方面问题的示例,希望大家多批评. 示例背景 参考数据字典 需求 OrderCode必须唯一. Total = Su ...
- javascript之纯数字验证
现在有一个需求如下图: 产品经理说Card Number只能让输入数字(中间的空格是格式自加的,也是用js实现的),有时候我脑海中出现了个声音,啥玩意,加个type=number不就行了,事实发现图样 ...
- 检测局域网中还可用的ip地址
#!/bin/bash ` do { .$i &>/dev/null ];then echo "192.168.1.$i is not used" fi } done
- struts2重点——ModelDriven
一.属性驱动 在目标 Action 类中,通过 setXxx() 方法来接收请求参数. 二.模型驱动 1.ParametersInterceptor 拦截器工作原理 ParametersInterce ...
- AJAX使用技巧:如何处理书签和翻页按扭
本篇文章提供了一个开源JavaScript库,它提供了给AJAX应用程序中添加书签和会退按钮的功能.在学习完这个教程后,开发者将能够对开发AJAX应用碰到的问题获得一个解决方案,这个特性甚至Googl ...
- Install gocode
1. D:\AWS_workspace\DAAS_Go>go get -u -ldflags -H=windowsgui github.com/nsf/gocode 2. Then gocode ...
- 前端技巧:禁止浏览器static files缓存篇(转)
前端技巧:禁止浏览器static files缓存篇 由于CSS/JS文件经常需要改动,前端调试时是不希望浏览器缓存这些文件的. 本文记录博主的经验. Meta法 目前在chrome调试还没有遇到问题, ...
- Jsoup实现java模拟登陆
Jsoup实现java模拟登陆 2013-10-29 14:52:05| 分类: web开发|举报|字号 订阅 下载LOFTER我的照片书 | 1:如何获取cookies. 1.1 ...