Spring-AOP之工作实践(二)
案例二、前端页面权限控制
对controllor控制器中的某写方法进行增强,如实现页面的按钮权限控制。
/**
* 保存session的容器
*/
public class SessionContext {
private static Map<String, HttpSession> sessionMap; // 单例
private SessionContext() { sessionMap = new ConcurrentHashMap<>(); } private enum SessionContextSingle {
INSTANCE;
private SessionContext sessionContext;
SessionContextSingle() {
sessionContext = new SessionContext();
}
public SessionContext getInstance() { return sessionContext; }
} public static SessionContext getInstance() {
return SessionContextSingle.INSTANCE.getInstance();
} // 添加session
public synchronized void addSession(HttpSession httpSession) {
if (httpSession != null) {
sessionMap.put(httpSession.getId(), httpSession);
}
} // 删除session
public synchronized void deleteSession(HttpSession httpSession) {
if (httpSession != null) {
sessionMap.remove(httpSession.getId());
}
} // 根据sessionId获取session
public HttpSession getSession(String sessionId) {
if (StringUtils.isBlank(sessionId)) {
return null;
}
return sessionMap.get(sessionId);
}
}
/**
* session监听器
*/
public class SessionListener implements HttpSessionListener {
private SessionContext sessionContext = SessionContext.getInstance(); // 在会话中第一次登录时,就调用该方法创建session
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession httpSession = httpSessionEvent.getSession();
httpSession.setMaxInactiveInterval(10);
sessionContext.addSession(httpSession);
} @Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession httpSession = httpSessionEvent.getSession();
sessionContext.deleteSession(httpSession);
}
}
/**
* main方法处理切面
*/
@Component
@Aspect
@Order(-1)
public class MainAspect {
@Autowired
private UserService userService; // 切入点
@Pointcut("execution(* com.demo.*.controller.*Controller.*main(String, ..))")
private void pointCut() {} // 前置通知,在执行目标方法之前执行
@Before("pointCut()")
public void main(Joinpoint joinpoint) {
// 获取sessionid
String sessionId = (String) joinpoint.getArgs()[0];
// 获取当前上下文的session对象
HttpSession httpSession = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
// 根据sessionId获取session对象
User user = SessionContext.getInstance().getSession(sessionId).getAttribute("user");
// 对当前上下文的session赋值
httpSession.setAttribute("user", user);
// 权限传到前端
ModelAndView modelAndView = (ModelAndView) joinpoint.getArgs()[1];
Map<String, Object> model = Maps.newHashMap();
model.put("hasAdminRole", userService.hasRole(NeedRole.ADMIN));
modelAndView.addAllObjects(model);
}
}
/**
* 前端处理器
*/
@Controller
public class DemoController {
@PostMapping("/main")
public String main(String sessionId, ModelAndView modelAndView) {
Map<String, Object> model = Maps.newHashMap();
modelAndView.setViewName("demo/main");;
return modelAndView;
}
}
<!--页面:可以使用切面中保存到request域中的权限值来判断,进而实现页面按钮角色权限控制-->
<a th:if="${hasAdminRole}" href="javascript:void(0)" onclick="submit()">提交</a>
Spring-AOP之工作实践(二)的更多相关文章
- spring cloud微服务实践二
在上一篇,我们已经搭建了spring cloud微服务中的注册中心.但只有一个注册中心还远远不够. 接下来我们就来尝试提供服务. 注:这一个系列的开发环境版本为 java1.8, spring boo ...
- 5.2 Spring5源码--Spring AOP源码分析二
目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...
- 5.2 spring5源码--spring AOP源码分析二--切面的配置方式
目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- 死磕Spring之AOP篇 - Spring AOP自动代理(二)筛选合适的通知器
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- Spring AOP日志实现(二)--获取访问者IP及访问路径
获取类及方法上的@RequestMapping注解: 应该是不等于: 获取访问者的ip地址,首先配置一个监听器: 配置完监听器后,就可以在类中注入一个HttpServletRequest: 获取ip:
- Spring aop 原始的工作原理的理解
理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...
- 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)
一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...
- spring aop介绍和示例
参考:<Spring in Action> 一.AOP介绍 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程. 应用中有一些功能使用非常普遍,比如事 ...
- spring Aop设计原理
转载至:https://blog.csdn.net/luanlouis/article/details/51095702 0.前言 Spring 提供了AOP(Aspect Oriented Prog ...
随机推荐
- Elasticsearch URI search 查询语法整理
Elasticsearch URI search 一.请求体查询与空查询 1. 请求体查询(request body search) 简单查询语句(lite)是一种有效的命令行adhoc查询.但是,如 ...
- 「雕爷学编程」Arduino动手做(40)——旋转编码器模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- linux常用命令---打包压缩解压
打包压缩解压
- Django路由配置之正则表达式详解
正则表达式详解 urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles ...
- redis学习——day01_redis简介与安装
一.Redis 简介 1.1 Redis是什么 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redi ...
- [PHP]用PHP自己写一个基于zoomeye的api(偷懒必备quq)
0x01 起因 因为手速慢,漏洞刷不过别人,一个个手补确实慢,所以想自己写一个api,一键抓取zoomeye的20页,然后就可以打批量了 ovo(真是太妙了!) 0x02 动工 1.抓包做 ...
- Linux下搭建mongDB环境
参考: https://blog.csdn.net/qq_35763837/article/details/79654023 https://www.linuxidc.com/Linux/2016-0 ...
- 【JavaScript数据结构系列】00-开篇
[JavaScript数据结构系列]00-开篇 码路工人 CoderMonkey 转载请注明作者与出处 ## 0. 开篇[JavaScript数据结构与算法] 大的计划,写以下两部分: 1[JavaS ...
- 【PyTorch】深度学习与PyTorch资料链接整理
欢迎来到我的博客! 以下链接均是日常学习,偶然得之,并加以收集整理,感兴趣的朋友可以多多访问和学习.如果以下内容对你有所帮助,不妨转载和分享.(Update on 5,November,2019) 1 ...
- 【书签】连续型特征的归一化和离散特征的one-hot编码
1. 连续型特征的常用的归一化方法.离散型特征one-hot编码的意义 2. 度量特征之间的相关性:余弦相似度和皮尔逊相关系数