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 ...
随机推荐
- 模拟LinkedList
Linkedlist是一个集合容器,具有增删改查基本功能,本例中模拟增删查,对于修改,只需要将原节点处的val更新为新值即可,增加和删除在链表中速度是比较快的,查找,修改慢,因为要从头或者从尾开始遍历 ...
- 百度地图java 判断当前位置是否在多边形区域内
package com.haiyisoft.cAssistant.adapter.hessian; import java.awt.geom.Point2D;import java.util.Arra ...
- 如何利用css进行网页布局
一.单列布局(类似于搜狐网站) 如: 代码为: 二.两列布局 1.固定宽度 代码为: 2.自适应 代码为: 三.三列布局 代码为: 四.混合布局 就是在前面的基础上,在进行划分块 如: 代码为:
- append和push和pop区别
append() 操作的是DOM节点,在被选元素的结尾(内部结尾)插入指定内容: push() 向数组末尾插入一个或者多个元素,并且返回新的长度: pop() 删除 ...
- 2019.11.07【每天学点SAP小知识】Day2 - ABAP 7.40新语法 - 内表
今天学习一下内表的表达式在ABAP 7.4之后的语法: SELECT * FROM mara INTO TABLE @DATA(gt_mara)UP TO 10 ROWS. DATA gt_mara_ ...
- Debian系统设置terminal快捷键
我安装的是debian gnome桌面版.安装完成之后,没有快捷键可以方便的打开terminal,需要自己设置这个快捷键 方法是: 桌面上点击右键==>设置==>键盘 ==>快捷键= ...
- 使用shiro遇到的问题
Caused by: java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException 解决问题:缺少一个依赖的缓存jar 添加: <d ...
- Python操作SQLite
1. 导入sqlite3数据库模块,从python2.5以后,sqlite3成为内置模块,不需要额外安装,只需要导入即可. import sqlite3 2.创建/打开数据库 使用connect方法打 ...
- 在web项目中获取ApplicationContext上下文的3种主要方式及适用情况
最近在做web项目,需要写一些工具方法,涉及到通过Java代码来获取spring中配置的bean,并对该bean进行操作的情形.而最关键的一步就是获取ApplicationContext,过程中纠结和 ...
- LeetCode.1071-字符串最大公约数(Greatest Common Divisor of Strings)
这是小川的第391次更新,第421篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第253题(顺位题号是1071).对于字符串S和T,当且仅当S = T + ... + T ...