案例二、前端页面权限控制

  对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之工作实践(二)的更多相关文章

  1. spring cloud微服务实践二

    在上一篇,我们已经搭建了spring cloud微服务中的注册中心.但只有一个注册中心还远远不够. 接下来我们就来尝试提供服务. 注:这一个系列的开发环境版本为 java1.8, spring boo ...

  2. 5.2 Spring5源码--Spring AOP源码分析二

    目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...

  3. 5.2 spring5源码--spring AOP源码分析二--切面的配置方式

    目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...

  4. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  5. 死磕Spring之AOP篇 - Spring AOP自动代理(二)筛选合适的通知器

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  6. Spring AOP日志实现(二)--获取访问者IP及访问路径

    获取类及方法上的@RequestMapping注解: 应该是不等于: 获取访问者的ip地址,首先配置一个监听器: 配置完监听器后,就可以在类中注入一个HttpServletRequest: 获取ip:

  7. Spring aop 原始的工作原理的理解

    理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...

  8. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

  9. spring aop介绍和示例

    参考:<Spring in Action> 一.AOP介绍 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程. 应用中有一些功能使用非常普遍,比如事 ...

  10. spring Aop设计原理

    转载至:https://blog.csdn.net/luanlouis/article/details/51095702 0.前言 Spring 提供了AOP(Aspect Oriented Prog ...

随机推荐

  1. Java openrasp学习记录(一)

    前言: 最近一直在做学校实验室安排的项目,太惨了,没多少时间学习新知识,不过rasp还是要挤挤时间学的,先从小例子的分析开始,了解rasp的基本设计思路,后面详细阅读openrasp的源码进行学习!欢 ...

  2. Netty源码死磕一(netty线程模型及EventLoop机制)

    引言 好久没有写博客了,近期准备把Netty源码啃一遍.在这之前本想直接看源码,但是看到后面发现其实效率不高, 有些概念还是有必要回头再细啃的,特别是其线程模型以及EventLoop的概念. 当然在开 ...

  3. 「雕爷学编程」Arduino动手做(37)——MQ-3酒精传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  4. C# 生成log文件

    public void WriteLog(string strLog) { string sFilePath = AppDomain.CurrentDomain.BaseDirectory + &qu ...

  5. JQuery 高级

    来源于传智播客老师发的笔记 今日内容: 1. JQuery 高级 1. 动画 2. 遍历 3. 事件绑定 4. 案例 5. 插件 JQuery 高级 1. 动画 1. 三种方式显示和隐藏元素 1. 默 ...

  6. hdu5967数学找规律+逆元

    Detachment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. BZOJ1022

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2701  Solved: 1721[Submit] ...

  8. poj3621 SPFA判断正环+二分答案

    Farmer John has decided to reward his cows for their hard work by taking them on a tour of the big c ...

  9. 【常用工具】vagrant的box哪里下?镜像在哪儿找?教你在vagrant官网下载各种最新.box资源

    进入vagrant官网 : https://www.vagrantup.com/ 点击findbox[寻找box],进入有很多box的列表 : https://app.vagrantup.com/bo ...

  10. 模板:分页JSP(结合Servlet)

    DAO类(后续无需改变) package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java ...