• 转:spring aop 拦截业务方法,实现权限控制


    难点: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.       
    5.     public static HttpServletRequest getRequest(){  
    6.         return requestLocal.get();  
    7.     }  
    8.       
    9.     public static void setRequest(HttpServletRequest request){  
    10.         requestLocal.set(request);  
    11.     }  
    12.       
    13.     public static HttpServletResponse getResponse(){  
    14.         return responseLocal.get();  
    15.     }  
    16.       
    17.     public static void setResponse(HttpServletResponse response){  
    18.         responseLocal.set(response);  
    19.     }  
    20.       
    21.     public static HttpSession getSession(){  
    22.         return (HttpSession)(getRequest()).getSession();  
    23.     }  
    24. }  

     

    2.添加过滤器

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

    3.配置web.xml

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

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

     

    5.applicationContext.xml

        1. <bean id="adminAspect" class="com.unei.aop.AdminAspect"></bean>
    奔跑吧..骄傲的少年!
  • 相关阅读:
    端口被sysmtem占用
    windows 服务器恢复选项恢复
    服务端相关知识学习(二)之Zookeeper可以干什么
    服务端相关知识学习(一)之什么是zookeeper
    whistle学习(二)之启动、停止、重启、更新whistle等命令
    whistle学习(一)之安装、使用、软件功能了解
    动画方案 Lottie 学习(二)之实战
    动画方案 Lottie 学习(一)之基础
    移动端真机debug调试神器 vConsole学习(二)之实战
    移动端真机debug调试神器 vConsole学习(一)之基础
  • 原文地址:https://www.cnblogs.com/jinloooong/p/7284124.html
Copyright © 2020-2023  润新知