转: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>
奔跑吧..骄傲的少年!
原文地址:https://www.cnblogs.com/jinloooong/p/7284124.html