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 ...
随机推荐
- Laravel find in set排序
做项目遇到个需求,需要对结果集中的数据进行指定规则的顺序排列.例如,用户状态有四种: 0=>未激活:1=>正常:2=>禁用:3=>软删除 现在的需求是,我要按照:正常-> ...
- Cannot use unsafe construct in safe context
https://stackoverflow.com/questions/25953887/how-to-use-unsafe-code-in-safe-contex I am not sure if ...
- oracle查看表空间的大小及使用情况sql语句
--------------------------tablespace------------------------------------------------ 1.//查看表空间的名称及大小 ...
- js如何获取鼠标位置
获取鼠标位置,首先需要加载js文件: 然后设置一个div,给定大小: 最后进行具体操作: //首先要先设置一个div,给定大小 <div id="m"></div ...
- 浏览器端-W3School-HTML:HTML DOM rows 集合
ylbtech-浏览器端-W3School-HTML:HTML DOM rows 集合 1.返回顶部 1. HTML DOM rows 集合 HTML DOM Table 对象 定义和用法 rows ...
- (4)rapidxml的详解及使用
RapidXml是指 XML DOM解析工具包,是一个快速的读写xml文件的库文件(hpp). (1)创建XML文件 #include <iostream> #includ ...
- 初探ASP.NET Web API (转)
http://www.cnblogs.com/mejoy/p/6402821.html 什么是ASP.NET Web API? 官方的解释是 ASP.NET Web API is a framewor ...
- spring boot starter是什么
参考自:https://www.cnblogs.com/EasonJim/p/7615801.html Spring Boot中Starter是什么 比如我们要在Spring Boot中引入Web M ...
- shaderToy学习篇
觉得shadertoy上的一些网友的作品写得很好,加上自己对glsl一些内置函数,内置变量不是很熟悉,于是决定开始学习一下上面一些大佬的代码. 今天的案例是这个: 附上shaderToy的地址:htt ...
- DateTime.UtcNow 协调通用时间(UTC)
1.协调通用时间(UTC) 2.本地时间和UTC时间相互转化 DateTime localDateTime = DateTime.Now;//本地时间 DateTime utcDateTime = D ...