难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要。思索很久没有办法,后来在网上看到了解决办法。

思路是:

i. SysContext  成员变量 request,session,response 
    ii. Filter 目的是给 SysContext 中的成员赋值 
    iii.然后在AOP中使用这个SysContext的值

要用好,需要理解  ThreadLocal和  和Filter 执行顺序

1.aop获取request,response,session等

  1. public class SysContext {
  2. private static ThreadLocal<HttpServletRequest> requestLocal=new ThreadLocal<HttpServletRequest>();
  3. private static ThreadLocal<HttpServletResponse> responseLocal=new ThreadLocal<HttpServletResponse>();
  4. public static HttpServletRequest getRequest(){
  5. return requestLocal.get();
  6. }
  7. public static void setRequest(HttpServletRequest request){
  8. requestLocal.set(request);
  9. }
  10. public static HttpServletResponse getResponse(){
  11. return responseLocal.get();
  12. }
  13. public static void setResponse(HttpServletResponse response){
  14. responseLocal.set(response);
  15. }
  16. public static HttpSession getSession(){
  17. return (HttpSession)(getRequest()).getSession();
  18. }
  19. }

2.添加过滤器

  1. public class GetContextFilter implements Filter{
  2. @Override
  3. public void destroy() {
  4. }
  5. @Override
  6. public void doFilter(ServletRequest request, ServletResponse response,
  7. FilterChain chain) throws IOException, ServletException {
  8. SysContext.setRequest((HttpServletRequest)request);
  9. SysContext.setResponse((HttpServletResponse)response);
  10. chain.doFilter(request, response);
  11. }
  12. @Override
  13. public void init(FilterConfig config) throws ServletException {
  14. }
  15. }

3.配置web.xml

将这部分放置在最前面,这样可以过滤到所有的请求

  1. <filter>
  2. <filter-name>sessionFilter</filter-name>
  3. <filter-class>com.unei.filter.GetContextFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>sessionFilter</filter-name>
  7. <url-pattern>*</url-pattern>
  8. </filter-mapping>

4.spring aop before

从session中取出用户名,如果不存在,抛出异常跳转,将错误信息放到request中

  1. @Aspect
  2. public class AdminAspect {
  3. ActionContext context = ActionContext.getContext();
  4. HttpServletRequest request;
  5. HttpServletResponse response;
  6. @Before("execution(* com.unei.Action.AdminAction.getPrivileges(..))")
  7. public void adminPrivilegeCheck()
  8. throws Throwable {
  9. HttpSession session = SysContext.getSession();
  10. request = SysContext.getRequest();
  11. response = SysContext.getResponse();
  12. String userName = "";
  13. try {
  14. userName = session.getAttribute("userName").toString();
  15. if(userName==null||userName.equals(""))
  16. throw new Exception("no privilege");
  17. } catch (Exception ex) {
  18. request.setAttribute("msg", "{\"res\":\"" + "无权限" + "\"}");
  19. try {
  20. request.getRequestDispatcher("/jsp/json.jsp").forward(
  21. request, response);
  22. } catch (ServletException e) {
  23. e.printStackTrace();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. }

5.applicationContext.xml

      1. <bean id="adminAspect" class="com.unei.aop.AdminAspect"></bean>

转:spring aop 拦截业务方法,实现权限控制的更多相关文章

  1. spring aop 拦截业务方法,实现权限控制

    难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要.思索很久没有办法,后来在网上看到了 ...

  2. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  3. Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  4. Spring Security(17)——基于方法的权限控制

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  5. 使用Spring AOP实现业务依赖解耦

    Spring IOC用于解决对象依赖之间的解耦,而Spring AOP则用于解决业务依赖之间的解耦: 统一在一个地方定义[通用功能],通过声明的方式定义这些通用的功能以何种[方式][织入]到某些[特定 ...

  6. Spring Security教程之基于方法的权限控制(十二)

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  7. Spring实战(十)Spring AOP应用——为方法引入新功能、为对象引入新方法

    切面最基本的元素是通知和切点,切点用于准确定位应该在什么地方应用切面的通知. 1.Spring借助AspectJ的切点表达式语言来定义Spring切面 在Spring中,要使用AspectJ的切点表达 ...

  8. 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制

    权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...

  9. JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理

    1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...

随机推荐

  1. 测试工程师,选择python还是java?

    问:“你平时工作中,用java多还是用python多”? 答:“都还可以,根据具体的场景选择不同的语言”. 问:“比如说呢”? 答:“开发自己的测试平台,肯定会选择java:在centos服务器跑一些 ...

  2. lucas定理(模板题题解)

    题目很简单,很暴力,就是组合数,没有其他的. 但是直接暴力会炸wow 我们可以利用Lucas定理来分解字问题. Lucas定理:C(n,m)(mod p)=C(n%p,m%p)*C(n/p,m/p)( ...

  3. apache+php+mysql搭建php环境

    1.首先准备解压包:zend-loader-php5.6-windows-x86_update1(nts版).php-5.6.37-nts-Win32-VC11-x86.mysql-5.5.19-wi ...

  4. Java基础语法01

    一.Java入门 Java 是最好的语言吗? 不是,因为在每个领域都有更合适的编程语言. Java技术体系平台 JavaSE//JavaEE//JavaME Java程序的结构 类{ 方法{ 语句; ...

  5. SpringBoot之微服务日志链路追踪

    SpringBoot之微服务日志链路追踪 简介 在微服务里,业务出现问题或者程序出的任何问题,都少不了查看日志,一般我们使用 ELK 相关的日志收集工具,服务多的情况下,业务问题也是有些难以排查,只能 ...

  6. 201871010114-李岩松《面向对象程序设计(java)》第八周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  7. vim查询替换

    查询: 在民令模式输入/或者? n/N 替换:

  8. AutoCad 二次开发 文字镜像

    AutoCad 二次开发 文字镜像 参考:https://adndevblog.typepad.com/autocad/2013/10/mirroring-a-dbtext-entity.html 在 ...

  9. J.U.C剖析与解读1(Lock的实现)

    J.U.C剖析与解读1(Lock的实现) 前言 为了节省各位的时间,我简单介绍一下这篇文章.这篇文章主要分为三块:Lock的实现,AQS的由来(通过演变的方式),JUC三大工具类的使用与原理剖析. L ...

  10. zabbix 发送报警邮件