
面向方面的编程AOP通常被定义为一种使软件系统能够实现关注点分离的技术. 该系统由许多不同的组件组成,每个组件负责特定的功能. 除了实现其核心功能之外,这些组件还经常承担其他责任. 诸如日志记录,事务管理和安全性之类的核心服务通常集成到具有自己核心业务逻辑的组件中. 这些系统服务通常被称为跨领域关注点,因为它们跨越了系统的多个组件
以下是一些与AOP相关的术语:
通知: 通知定义方面是什么以及何时使用它的概念. Spring方面可以应用5种通知类型:
之前: 在调用目标方法之前调用通知函数.
之后: 在目标方法完成后调用该通知. 目前,它不在乎该方法的输出是什么.

返回后: 成功执行目标方法后调用通知.
抛出后: 在目标方法抛出异常之后调用通知.
周围: 通知将包装被通知的方法,并在调用被通知的方法之前和之后执行自定义行为.
结合点: 在应用程序执行过程中可以插入方面的点.
切点: 切点定义一个或多个要在其中编织切割平面的连接点.

方面: 通知和切线的组合. 通知和切入点共同定义了方面的全部内容.
简介: 简介允许我们向现有的类添加新的方法或属性.
编织: 将方面应用于目标对象并创建新的代理对象的过程. 在指定的连接点将外观编织到目标对象中. 在目标对象的生命周期中有多个点可以编织成:
编译时间: 编译目标类时将各个方面编织在一起. 这种方法需要特殊的编译器. AspectJ的编织编译器正在以这种方式编织到方面.
类加载期: 将目标加载到JVM时将编织各个方面. 这种方法需要特殊的类加载器,该加载器可以在将目标类引入应用程序之前对其进行增强.

运行时: 当应用程序运行到特定时刻时,各个方面就交织在一起. 通常,当编织到方面时,AOP容器会动态创建目标对象的代理对象. 通过这种方式将SpringAOP编织到这个方面.
package com.sxk.aop;
import com.sxk.entity.Token;
import com.sxk.service.AuthorityService;
import com.sxk.service.TokenService;
import org.apache.commons.fileupload.RequestContext;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
/**
* Created by stonegeek on 2017/3/4.
*/
@Aspect
public class AroundTest {
@Autowired
TokenService tokenService;
@Autowired
AuthorityService authorityService;
@Pointcut("execution(public * com.sxk.controller.testcontroller.*(..))")
public void testaround(){}
@Around("testaround()")
public Object test(ProceedingJoinPoint jp) throws Throwable{
System.out.println("开始验证Token权限。。。。");
HttpServletRequest request= ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
String tokenName=this.getToken(request);
String url=this.getURL(request);
String method=this.getMethod(request);
System.out.println("Token为:"+tokenName);
System.out.println("URL为:"+url);
System.out.println("Method为:"+method);
Token token=tokenService.findByTokenName(tokenName);
if(token==null)
return "{'result':'Token not exsits'}";
Timestamp creatTime=token.getCreateTime();
int len=token.getEffectiveTime();
Timestamp timeNow=new Timestamp(new Date().getTime());
List<String> allApi=null;
if((creatTime.getTime()+len*1000*60)>=timeNow.getTime()){
allApi=authorityService.getAPI(tokenName);
System.out.println(allApi);
if(allApi!=null&&allApi.contains(url)){
System.out.println("Token验证通过!!!");
return jp.proceed();
}else {
System.out.println("验证失败!!!");
return "{'result':'No authority for this API!!'}";
}
}else {
System.out.println("The Token is Timeout");
return "{'result':'The Token is Timeout!!'}";
}
}
public String getToken(HttpServletRequest request){
return request.getHeader("token");
}
public String getURL(HttpServletRequest request){
return request.getRequestURI();
}
public String getMethod(HttpServletRequest request){
return request.getMethod();
}
}
详细代码:
在管理系统调用后台接口之前,它将拦截. 拦截方法是通过((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())获取请求. getRequest(). 该请求的标头中将有一个键值((从前端和后台收缩),键是令牌,值是tokenName,此tokenName是UUID,然后使用此tokenName在中查询此令牌. 如果不存在spring aop 判断登录,则返回令牌不存在;如果存在,则确定令牌是否存在. 令牌过期时,令牌创建时间和有效时间存储在令牌表中;如果令牌过期,则令牌为如果令牌有效,则通过令牌名查询令牌的所有允许的API的权限表,然后请求和API比较(如果允许)请求资源,否则不返回此api的权限. / p>
package com.sxk.service.impl;
import com.sxk.dao.TokenMapper;
import com.sxk.dao.UserMapper;
import com.sxk.service.Login_Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.sql.Timestamp;
import java.util.Date;
import java.util.UUID;
import com.sxk.entity.User;
import com.sxk.entity.Token;
/**
* Created by stonegeek on 2017/3/5.
*/
@Service("login_ServiceImpl")
public class Login_ServiceImpl implements Login_Service {
int effectTime=200;
@Autowired
private UserMapper userMapper;
@Autowired
private TokenMapper tokenMapper;
@Override
public String login(String userName, String password) {
String json=null;
System.out.println("【认证中心】得到用户名和密码分别为:"+userName+","+password);
User user=userMapper.login(userName,password);
System.out.println(user);
Token token;
if (user!=null) {
System.out.println("【认证中心】用户名、密码验证通过!");
UUID tokenName = UUID.randomUUID();
token = new Token();
token.setLoginName(userName);
token.setTokenName(tokenName.toString());
Timestamp timeNow = new Timestamp(new Date().getTime());
token.setCreateTime(timeNow);
token.setEffectiveTime(effectTime);
System.out.println("别再出错了");
if (tokenMapper.findByLoginName(userName) == null) {
tokenMapper.insert(token);
} else {
tokenMapper.updateByPrimaryKeySelective(token);
}
json = "{\"token\":\"" + tokenName.toString() + "\"}";
}else{
json="{\"token\":\"false\"}";
}
System.out.println(json);
return json;
}
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-153535-1.html
活该