Spring AOP实现功能权限校验功能的示例代码

  

实现功能权限校验的功能有多种方法,其一使用拦截器拦截请求,其二是使用AOP抛异常。
  

  

首先用拦截器实现未登录时跳转到登录界面的功能。注意这里没有使用AOP切入,而是用拦截器拦截,因为AOP一般切入的是服务层方法,而拦截器是拦截控制器层的请求,它本身也是一个处理器,可以直接中断请求的传递并返回视图,而AOP则不可以。

  

<强> 1。使用拦截器实现未登录时跳转到登录界面的功能

  

<强> 1.1拦截器SecurityInterceptor

        包com.jykj.demo.filter;   进口java.io.PrintWriter;   进口javax.servlet.http.HttpServletRequest;   进口javax.servlet.http.HttpServletResponse;   进口javax.servlet.http.HttpSession;   进口org.springframework.web.servlet.HandlerInterceptor;   进口org.springframework.web.servlet.ModelAndView;   进口com.alibaba.fastjson.JSON;   进口com.jykj.demo.util.Helper;   进口com.jykj.demo.util.Result;      公共类SecurityInterceptor实现HandlerInterceptor {   @Override   公共布尔preHandle (HttpServletRequest请求,HttpServletResponse响应对象处理程序)   抛出异常{   System.out.println (“SecurityInterceptor:“+ request.getContextPath () +”、“+ request.getRequestURI () +”、“+ request.getMethod ());   HttpSession会话=request.getSession ();   如果(session.getAttribute (Helper.SESSION_USER)==null) {   System.out.println (“AuthorizationException:未登录!”+ request.getMethod ());   如果(“POST”.equalsIgnoreCase (request.getMethod ())) {   response.setContentType (" text/html;charset=utf - 8”);   PrintWriter=response.getWriter ();   out.write (JSON。toJSONString(新结果(假,“未登录!”)));   out.flush ();   out.close ();   其他}{   response.sendRedirect (request.getContextPath() + "/登录");   }   返回错误;   其他}{   返回true;   }   }      @Override   公共空白postHandle (HttpServletRequest请求,HttpServletResponse响应对象处理程序,   {ModelAndView ModelAndView)抛出异常//TODO自动生成方法存根   }      @Override   公共空间afterCompletion (HttpServletRequest请求,HttpServletResponse响应、对象处理程序异常交货)   抛出异常{//TODO自动生成方法存根   }   }      之前      

<强> 1.2.spring-mvc.xml(拦截器配置部分)

        & lt; !——处理HTTP GET请求/资源/* *通过有效地服务于静态资源目录$ {webappRoot}/资源——比;   & lt; mvc:资源映射="/资源/* *”位置="/资源//比;   & lt; mvc: interceptors>   & lt; mvc: interceptor>   & lt; mvc:映射路径="/* "/比;& lt; !——拦截//测试/登录等等单层结构的请求——比;   & lt; mvc:映射路径="/* */* . aspx "/祝辞& lt; !——拦截后缀为。aspx的请求——比;   & lt; mvc:映射路径="/* */*,"/祝辞& lt; !——拦截后缀为,的请求——比;=& lt; mvc: exclude-mapping路径“/登录”/比;=& lt; mvc: exclude-mapping路径“/signIn”/比;=& lt; mvc: exclude-mapping路径“/注册”/比;   & lt; bean类=癱om.jykj.demo.filter.SecurityInterceptor”比;   & lt;/bean>   & lt;/mvc: interceptor>   & lt;/mvc: interceptors>   之前      

这里需要特别说明:拦截器拦截的路径最好是带有后缀名的,否则一些静态的资源文件不好控制,也就是说请求最好有一个统一的格式如,等等,这样匹配与过滤速度会非常快。如果不这样,例如用/* *来拦截所有的请求,则页面渲染速度会非常慢,因为资源文件也被拦截了。

  

<强> 2。使用AOP实现功能权限校验

  

对于功能权限校验也可以类似地用拦截器来实现,只不过会拦截所有的请求,对不需要权限校验的请求没有很好的过滤功能,所以采用AOP指定拦截需要校验的方法的方式来实现之。

  

<强> 2.1切面类PermissionAspect

        包com.jykj.demo.filter;   进口java.io.IOException;   进口java.lang.reflect.Method;   进口org.aspectj.lang.JoinPoint;   进口org.aspectj.lang.reflect.MethodSignature;   进口org.springframework.beans.factory.annotation.Autowired;   进口com.jykj.demo.annotation.ValidatePermission;   进口com.jykj.demo.exception.AccessDeniedException;   进口com.jykj.demo.service.SysUserRolePermService;/* *   *事件日志切面,凡是带有@ValidatePermission以及@ResponseBody注解控制器都要进行功能权限检查,   *若无权限,则抛出AccessDeniedException异常,该异常将请求转发至一个控制器,然后将异常结果返回   * @author管理员   *   */公开课PermissionAspect {   @ autowired   SysUserRolePermService SysUserRolePermService;   公共空doBefore (jp)的连接点抛出IOException {   系统。   “日志PermissionAspect方法:”+ jp.getTarget () .getClass () . getname () +“。”+ jp.getSignature () . getname ());   方法soruceMethod=getSourceMethod (jp);   如果(soruceMethod !=null) {   ValidatePermission=soruceMethod.getAnnotation歌剧院(ValidatePermission.class);   如果(打开!=null) {   int fIdx=oper.idx ();   对象[]参数=jp.getArgs ();   如果(fIdx>=0,, fIdx

Spring AOP实现功能权限校验功能的示例代码