1.前言
上次我们认识了java责任链模式的设计,那么接下来将给大家展示责任链模式项目中的实际运用。如何快速搭建责任链模式的项目中运用。
2.简单技术准备
我们要在项目中使用借助这样的几个知识的组合运用,才能更好的诠释。
必备技能:
简单注解的定义;
Spring拦截器的使用;
简答的责任链模式的定义;
拥有以前的准备的知识点的,我们就可以快速搭建责任链来做安全校验了。
3. 场景模拟
场景:
系统中我们需要一些安全校验结构,如登陆校验与角色校验。接下来我们使用责任链模式来开发这个流程化校验。
4. 设计模式
我们将设计一个web项目,采用springmvc
框架。开发语言使用JAVA。
执行过程执行过程:
SpringMVC拦截器 --- > 拦截指定注解 --- >
进入责任链处理
5编码实战
5.1 注解定义
定义一个Permission注解
/** * 权限 拦截 * @author MR.YongGan.Zhang * */ @Inherited @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Permission { VerifyType verifyType() default VerifyType.LOGIN; String[] verifyValue () default ""; } |
其中 是枚举类型的校验类型
/** * 校验的种类 * * NONE 不校验 * LOGIN 登陆校验 * ROLE 角色校验 * * @author MR.YongGan.Zhang * */ public enum VerifyType { NONE, LOGIN, ROLE; } |
5.2拦截器定义
我们定义拦截器PermissionInterceptor,实际上也是注解解析器。我们将借助于springMVC来做拦截器。
我们使用springMVC
拦截器可以实现 org.springframework.web.servlet.HandlerInterceptor
重写接口的三个方法即可。
我们一起看看是如何实现的。
import
java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.shsxt.framework.Permission.Permission; import com.shsxt.framework.Permission.handlerchain.PermissionHandlerChainStaticFactory; import com.shsxt.framework.Permission.handlerchain.PermissionWithNone; import com.shsxt.framework.constant.VerifyType; /** * 安全校验 * * 1. 拦截 用户是否登陆 * 2. 权限拦截 * * * @author MR.YongGan.Zhang * @version 1.0.1 * * 备注: 1.0.0 实现用户登陆拦截 1.0.1 增加实现权限 * */ public class PermissionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.err.println(" 进入 PermissionInterceptor 。。。 "); System.err.println(handler.getClass().getName()); if (handler instanceof HandlerMethod) { HandlerMethod hm = (HandlerMethod) handler; Method method = hm.getMethod(); // 如果包含了 Permission 注解 if (method.isAnnotationPresent(Permission.class)) { // Permission permission = method.getAnnotation(Permission.class); // 获取 注解 中的属性 VerifyType verifyType = permission.verifyType(); // 获取权限校验值 String[] verifyValue = permission.verifyValue(); // 责任链模式 校验 PermissionWithNone permissionWithNone = PermissionHandlerChainStaticFactory.createPermissionWithNone(); // 执行结果 boolean bool = permissionWithNone.handleChain(verifyType,request,verifyValue); System.err.println(bool); return bool; } } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } } |
我们定义好了拦截器,下一步需要将我们拦截器配置给我们springMVC容器中管理