Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)
参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/
1.首先,spring的AOP作用范围很广,可以使用Aspectj的execution表达式自定以切面的位置。
比如下面的配置service方法执行日志:
<!-- 系统日志 -->
<bean id="logUtils" class="com.tabchanj.crm.utils.SystemLogUtils">
<property name="logService" ref="systemLogService"></property>
</bean> <aop:config>
<aop:pointcut expression="execution(* com.tabchanj.crm.service..*.*(..))" id="logPointcut"/>
<aop:aspect ref="logUtils">
<aop:after method="writeLog" pointcut-ref="logPointcut" />
</aop:aspect>
</aop:config>
2.而struts2的拦截器,继承于AbstractInterceptor,并覆盖其中的intercept方法,它只能作用于action,对所有的action进行拦截。
package com.tabchanj.pss.web.interceptor; import java.util.Arrays;
import java.util.List; import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.tabchanj.pss.domain.Employee;
import com.tabchanj.pss.service.IEmployeeService;
import com.tabchanj.pss.web.action.BaseAction; public class LoginInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 3673324815465858383L;
private List<String> actionList;
private IEmployeeService employeeService; public void setEmployeeService(IEmployeeService employeeService) {
this.employeeService = employeeService;
} public void setActionList(String actionList) { this.actionList = Arrays.asList(actionList.split(","));
} @Override
public String intercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (actionList.contains(action.getClass().getSimpleName())) {
return invocation.invoke();
}
Employee employee = (Employee) ActionContext.getContext().getSession().get(BaseAction.LOGIN_USER);
if (employee == null) {
return Action.LOGIN;
}
// 查询出该action的全类名
String className = action.getClass().getName();
// 查询出当前所要访问的方法
String methodName = invocation.getProxy().getMethod();
// 将当前要访问的全类名和要访问的方法拼在一起
String classMethodName = className + "." + methodName;
// 拼出该action下的所有方法
String allclassMethodName = className + ".ALL";
// 查询出所有的资源method名称
List<String> allResourceMethod = employeeService.getAllResourcesMethod();
if (allResourceMethod.contains(classMethodName) || allResourceMethod.contains(allclassMethodName)) {
// 查询出该当前用户所用的资源列表
List<String> loginUserMethods = employeeService.findAllResourcesByLogin(employee.getId());
System.out.println("用户的资源2" + loginUserMethods);
if (loginUserMethods.contains(classMethodName) || loginUserMethods.contains(allclassMethodName)) {
return invocation.invoke();
} else {
return "auth";
}
}
return invocation.invoke();
} }
3.而springMVC的拦截器,只拦截Controller,其实现于HandlerInterceptor接口,并根据需要覆盖其中的3个分别在controller前后执行的方法,
package com.tabchanj.crm.web.interceptor; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import com.tabchanj.crm.domain.Employee;
import com.tabchanj.crm.utils.UserContext; public class AuthInterceptor implements HandlerInterceptor { public AuthInterceptor() {
System.out.println("AuthInterceptor初始化。。。。");
} public static final String LOGIN_PATH = "/checkLogin"; /**
* 1.在调用控制器方法前,拦截
*
* 返回值为false,代表拦截 返回值为true,代表放行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// System.out.println("AuthInterceptor....preHandle");
/**
* 1、登陆验证
*/
// 获取session用户
Employee user = UserContext.getUser();
// 检查用户是否存在
if (user == null && !LOGIN_PATH.equals(request.getRequestURI())) {
response.sendRedirect("/login.jsp");
return false;
} /**
* 2、URL权限验证
*/
// 1、获取用户请求的地址
// 把handler转变成HandlerMethod对象
if (handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod) handler;
// 获取控制器名称
String controllerName = hm.getBean().getClass().getName();
// 获取方法名;
String methodName = hm.getMethod().getName();
// 拼装resource名称
String resourceName = controllerName + ":" + methodName;
// 4.验证用户上,是否有请求资源对应的权限
if (UserContext.checkUserResPermission(resourceName)) {
return true;// 放行
} else {
response.sendRedirect("/data/noPermission.json");// 拦截,返回提示界面
return false; }
} return true;// 放行 } /**
* 2.在调用控制器方法后,拦截(在生成视图之前)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// System.out.println("AuthInterceptor..postHandle....."); } /**
* 3.在视图生成之后(后台所有所有逻辑都完成后)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// System.out.println("AuthInterceptor...afterCompletion....."); } }
Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)的更多相关文章
- 谈谈 Struts2 的拦截器
套话 相信非常多人都用过 Struts2 了,当然,对 Struts2 的原理也都比較了解.之前在一个项目中就已经用到了,当初的理解也不过局限在应用的层面上,对于更深层次的原理.机制,了解的并非非常多 ...
- struts2.1笔记03:AOP编程和拦截器概念的简介
1.AOP编程 AOP编程,也叫面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用A ...
- Struts2的拦截器是如何使用AOP工作的
拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...
- Struts2自定义拦截器Interceptor以及拦截器登录实例
1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...
- JavaWeb_(Struts2框架)拦截器interceptor
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- JavaWeb框架_Struts2_(三)---->Struts2的拦截器
2. Struts2的拦截器(使用拦截器实现权限控制) 2.1 拦截器的概述 拦截器是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器.Struts ...
- struts2总结六: Struts2的拦截器
一.Struts2的系统结构图
- Struts2自定义拦截器处理全局异常
今天在整理之前的项目的时候想着有的action层没有做异常处理,于是想着自定义拦截器处理一下未拦截的异常. 代码: package cn.xm.exam.action.safeHat; import ...
- 【struts2】拦截器基础
1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Strut ...
随机推荐
- MVC中上传文件
与asp.net中几乎一样,使用表单提交的方式上传文件(如果是使用了第三方插件的话,那么就另当别论) @{ ViewBag.Title = "Index"; Layout = nu ...
- LC 712. Minimum ASCII Delete Sum for Two Strings
Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...
- 依赖注入框架之androidannotations
主页: http://androidannotations.org/ 用途: 1. 使用依赖注入Views,extras,System Service,resources 2. 简化线程模型 3. 事 ...
- css实现左侧固定宽度,右侧宽度自适应
#centerDIV { height: 550px; width: 100%; } #mainDIV { height: 100%; border: 1px solid #F00; margin-l ...
- Python学习笔记:读取Excel的xlrd模块
一.安装xlrd 可以使用命令行安装也可使用pycharm进行安装 表示xlrd库已经安装成功,安装成功后,我们就可以导入使用了. 二.xlrd说明 (1.单元格常用的数据类型包括 0:empty(空 ...
- (转)MongoDB 分片集群技术
1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...
- kvm简介及创建虚拟化安装(1)
kvm虚拟化介绍 一.虚拟化分类 1.虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立 ...
- EncryptFac 加解密小工具
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【学习笔记】python3中yaml文件使用
1.yaml -> 字典:用yaml.load()或yaml.safe_load(YAML字符串或文件句柄),如yaml中有中文,可以使用.encode('utf-8')或打开文件时指定enco ...
- 微信小程序-T
微信小程序安装完毕后,真机调试及预览(打开调试模式)有数据,其他类型无数据在微信公众号-开发-域名信息中绑定正确的域名即可 配置微信小程序合法域名微信公众号-开发微擎应用-基础设置微信app-site ...