和田网站制作,西宁服务,自建wordpress主题,梧州高端网站建设服务场景描述#xff1a;现在需要对部分Controller或者Controller里面的服务方法进行权限拦截。如果存在我们自定义的注解#xff0c;通过自定义注解提取所需的权限值#xff0c;然后对比session中的权限判断当前用户是否具有对该控制器或控制器方法的访问权限。如果没有相关权限… 场景描述现在需要对部分Controller或者Controller里面的服务方法进行权限拦截。如果存在我们自定义的注解通过自定义注解提取所需的权限值然后对比session中的权限判断当前用户是否具有对该控制器或控制器方法的访问权限。如果没有相关权限则终止控制器方法执行直接返回。有两种方式对这种情况进行处理。 方式一使用SpringAOP中的环绕Around 方式二使用Spring web拦截器 标签 Spring 代码片段(4)[全屏查看所有代码] 1. [代码]定义注解 ? 1 2 3 4 5 6 7 8 9 10 11 12 Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD,ElementType.TYPE}) Documented //最高优先级 Order(Ordered.HIGHEST_PRECEDENCE) public interface RoleControl { /** * * 角色类型以便决定是否具有相关权限 */ String value() default user; } 2. [代码]在Controller中使用 ? 1 2 3 4 5 6 7 8 9 10 11 12 RoleControl(ADMIN) Controller public class LoginController { Autowired private UserService uService; Autowired private GlobalConfigService gcService; RoleControl() RequestMapping(/login) public String login(HttpServletRequest request,HttpServletResponse resp, ModelAttribute(user) UserDto uDto) { return } 3. [代码]方式一使用SpringAOP中的环绕Around ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 Component Aspect public class RoleControlAspect { /**类上注解情形 */ // Pointcut(within(net.xby1993.springmvc.annotation.RoleControl)) Pointcut(execution(* net.xby1993.springmvc.controller..*.*(..)) within(net.xby1993.springmvc.annotation.RoleControl)) public void aspect(){ } /**方法上注解情形 */ Pointcut(execution(* net.xby1993.springmvc.controller..*.*(..)) annotation(net.xby1993.springmvc.annotation.RoleControl)) public void aspect2(){ } /**aop实际拦截两种情形*/ Around(aspect() || aspect2()) public Object doBefore(ProceedingJoinPoint point) { HttpServletRequest request ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); HttpSession sessionrequest.getSession(); Object target point.getTarget(); String method point.getSignature().getName(); Class? classz target.getClass(); Method m ((MethodSignature) point.getSignature()).getMethod(); try { if (classz!null m ! null ) { boolean isClzAnnotation classz.isAnnotationPresent(RoleControl.class); boolean isMethondAnnotationm.isAnnotationPresent(RoleControl.class); RoleControl rcnull; //如果方法和类声明中同时存在这个注解那么方法中的会覆盖类中的设定。 if(isMethondAnnotation){ rcm.getAnnotation(RoleControl.class); }else if(isClzAnnotation){ rcclassz.getAnnotation(RoleControl.class); } String valuerc.value(); Object objsession.getAttribute(GeneUtil.SESSION_USERTYPE_KEY); String curUserTypeobjnull?:obj.toString(); //进行角色访问的权限控制只有当前用户是需要的角色才予以访问。 boolean isEqualsStringUtils.checkEquals(value, curUserType); if(isEquals){ try { return point.proceed(); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }catch(Exception e){ } return null; } } 4. [代码]方式二使用拦截器推荐 跳至 [1] [2] [3] [4] [全屏预览] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import net.xby1993.springmvc.annotation.RoleControl; import net.xby1993.springmvc.util.GeneUtil; import net.xby1993.springmvc.util.PathUtil; import net.xby1993.springmvc.util.StringUtils; public class GlobalInterceptor extends HandlerInterceptorAdapter{ private static Logger logLoggerFactory.getLogger(LoginInterceptor.class); Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession srequest.getSession(); s.setAttribute(host, PathUtil.getHost()); s.setAttribute(siteName, GeneUtil.SITE_NAME); //角色权限控制访问 return roleControl(request,response,handler); } /**角色权限控制访问*/ private boolean roleControl(HttpServletRequest request,HttpServletResponse response, Object handler){ HttpSession sessionrequest.getSession(); System.out.println(handler.getClass().getName()); if(handler instanceof HandlerMethod){ HandlerMethod hm(HandlerMethod)handler; Object targethm.getBean(); Class? clazzhm.getBeanType(); Method mhm.getMethod(); try { if (clazz!null m ! null ) { boolean isClzAnnotation clazz.isAnnotationPresent(RoleControl.class); boolean isMethondAnnotationm.isAnnotationPresent(RoleControl.class); RoleControl rcnull; //如果方法和类声明中同时存在这个注解那么方法中的会覆盖类中的设定。 if(isMethondAnnotation){ rcm.getAnnotation(RoleControl.class); }else if(isClzAnnotation){ rcclazz.getAnnotation(RoleControl.class); } String valuerc.value(); Object objsession.getAttribute(GeneUtil.SESSION_USERTYPE_KEY); String curUserTypeobjnull?:obj.toString(); //进行角色访问的权限控制只有当前用户是需要的角色才予以访问。 boolean isEqualsStringUtils.checkEquals(value, curUserType); if(!isEquals){ //401未授权访问 response.setStatus(401); return false; } } }catch(Exception e){ } } return true; }