实现功能权限校验的功能有多种方法,其一使用拦截器拦截请求,其二是使用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,, fIdxSpring AOP实现功能权限校验功能的示例代码