背景:
权限控制其实我们可以在程序中直接做,如下:
- @Controller
- @RequestMapping("/appDetail.htm")
- public class AppDetailController {
- @RequestMapping(method = RequestMethod.GET)
- public String doGet(ModelMap modelMap, HttpServletRequest httpServletRequest) {
- //1. 开发者有效性判断
- Developer developer = developerManageServiceClient
- .getByCardNo(cardNo);
- if (null == developer){
- return ERROR_VM;
- }
- if (DeveloperStatus.VALID != developer.getStatus() && DeveloperStatus.FREEZE != developer.getStatus()) {
- return ERROR_VM;
- }
- //2. 业务操作,此处省略
- }
- }
- @Controller
- @RequestMapping("/appBaseInfoEdit.htm")
- public class AppBaseInfoEditController {
- @RequestMapping(method = RequestMethod.POST)
- public String modify(ModelMap modelMap, HttpServletRequest httpServletRequest, AppBaseInfoForm appBaseInfoForm) {
- //1. 开发者有效性判断
- Developer developer = developerManageServiceClient
- .getByCardNo(cardNo);
- if (null == developer){
- return ERROR_VM;
- }
- if (DeveloperStatus.VALID != developer.getStatus()) {
- return ERROR_VM;
- }
- //2. 业务操作,此处省略
- }
- }
但是我们会嫌这样的重复代码太多,所以才会有如下做法。
1. 在controller上使用自定义注释,将角色传入
@Controller @Permission(permissionTypes = { RoleEnum.ADMIN, RoleEnum.LEADER }) public class FeedbackController extends BaseController { @Autowired private FeedbackService feedbackService; @ResponseBody @RequestMapping(value = "/event", method = RequestMethod.GET) public ResultVO find(HttpServletRequest request, Long userId) { System.out.println("进入Controller啦"); System.out.println("我是方法"); ResultVO result = new ResultVO(); result.setMessage("进来Controller啦"); result.setData(feedbackService.find(userId)); return result; } }
其中@Permission(permissionTypes = { PermissionEnum.ADMIN, PermissionEnum.LEADER }),是我们的自定义注释,上面可以赋值角色。
2. 编写我们的自定义注释类
@Documented @Inherited @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Permission { /** 检查项枚举 */ RoleEnum[] permissionTypes() default {}; }
3. 编写拦截器
/** * 权限拦截器 * @author Carson * */ public class PermissionCheckInterceptor extends HandlerInterceptorAdapter { /** 权限检查服务 */ @Autowired private PermissionCheckProcessor permissionCheckProcessor; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (handler.getClass().isAssignableFrom(HandlerMethod.class)) { HandlerMethod method = (HandlerMethod) handler; // 先从方法上那注释 Permission permission = method.getMethodAnnotation(Permission.class); // 如果方法中拿不到,就在类中找 if (permission == null) { permission = AnnotationUtils.findAnnotation(method.getBeanType(), Permission.class); } return permissionCheckProcessor.process(permission, request,response); } else { return true; } } }
4. 编写权限检查器,所有的权限检查都在这里做,可以避免重复代码
@Repository public class PermissionCheckProcessor { @Autowired private UserDao userDao; public boolean process(Permission permission, HttpServletRequest request, HttpServletResponse response) { try { Long userId = Long.parseLong(request.getParameter("userId")); HttpSession session = request.getSession(false); if(null != session){ //查询用户 User user = userDao.get(userId); for (RoleEnum permissionEnum : permission.permissionTypes()) { if (permissionEnum.toIntValue() == user.getRoleId()) { return true; } } } // sendRedirect(response, ISV_APPLY_URL); return false; } catch (Exception e) { // sendRedirect(response, ISV_APPLY_URL); return false; } } // private void sendRedirect(HttpServletResponse response, String redirectURI) { // URIBroker uriBroker = uriBrokerManager.getUriBroker(redirectURI); // String url = uriBroker.render(); // try { // response.sendRedirect(url); // } catch (IOException e) { // logger.error("转向页面:" + url + "跳转出错:", e); // } // } }
5. 角色枚举,这个只是我自己定义的角色
public enum RoleEnum { ADMIN(1), LEADER(2), SUPPORT(3), VOLUNTEER(4), SECURITY_ADMIN(5), SUPER_ADMIN(6) ; private int key; private RoleEnum(int key) { this.key = key; } public int toIntValue() { return this.key; } public static RoleEnum toKey(int key) { if (ADMIN.key == key) { return ADMIN; } else if (LEADER.key == key) { return LEADER; } else if (SUPPORT.key == key) { return SUPPORT; } else if (VOLUNTEER.key == key) { return VOLUNTEER; } else if (SECURITY_ADMIN.key == key) { return SECURITY_ADMIN; } else if (SUPER_ADMIN.key == key) { return SUPER_ADMIN; } else { throw new InvalidArgumentException("Unknown RoleKey[" + key + "]."); } } }
6. 拦截器定义,其中可以定义权限控制拦截器只拦截哪些请求
<!-- 拦截器 --> <mvc:interceptors> <!-- 所有请求都拦截 --> <bean id="testInterceptor" class="com.youyu4.interceptor.TestInterceptor"></bean> <!-- 只有特定请求才拦截 --> <mvc:interceptor> <mvc:mapping path="/event" /> <bean id="permissionCheckInterceptor" class="com.youyu4.interceptor.PermissionCheckInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
相关推荐
Struts2拦截器实现权限控制demo,我感觉对初学者还是有一定帮助的
该压缩包实现了利用过滤器或者拦截器对登录信息进行验证跳转登陆页的功能,利用的是SpringBoot和thymeleaf,使用前请先看使用说明
STRUTS2拦截器控制页面访问权限的设计与实现,解决基于STRUTS2的web应用的程序访问控制,防止非法访问
NULL 博文链接:https://vti-iteye.iteye.com/blog/1963397
主要给大家介绍了关于mybatis拦截器实现通用权限字段添加的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
struts2 用拦截器 实现用户权限登录 可以直接运行,只单单用到struts的东西。
springboot spring aop 拦截器 注解方式实现脱敏(涉及到:pom.xml -->application.properties --->启动类-->拦截器)
浅谈基于过滤器与拦截器的用户访问控制,stuts2中拦截器和过滤器的应用
1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求后各调一次。 4、拦截...
使用struts拦截器+注解实现日志审计功能 详见博客: http://blog.csdn.net/lk_blog/article/details/10248395
拦截器实现权限管理,没与数据库交互,不过原理差不多了
Spring Boot mvc web拦截器实现权限访问控制等功能(csdn)————程序
NULL 博文链接:https://luckyhua.iteye.com/blog/1863458
java 元注解+拦截器实现自定义注解 @CmwAutoWired:自定义依赖注入 注意:注入的接口和实现类需要在同一包名下,注解的是类则无限制 @FieldAnnotation:自定义属性注解 @MethodAnnotation:自定义方法注解 @...
企业级开发-SpringMVC使用拦截器实现用户登录权限验证实验报告
springmvc +mybatis采用策略设计模式基于拦截器实现按年分表
一个简单使用structs2拦截器实现使用自定义拦截器来完成用户权限的控制:当浏览者需要请求执行某个操作时,应用需要先检查浏览者是否登录,以及是否有足够的权限来执行该操作。 系统登陆之前点击查询自动跳入登陆...
运用struts2的拦截器技术实现的页面检测拦截非法用户饿坏指定用户注册。。。
利用Struts2的核心技术----拦截器实现权限控制。详细代码详解
2、拦截器实现权限控制:菜单管理,权限管理(按钮及用户级别权限) 3、SpringBoot框架,注解使用 4、图片上传技术 5、籍贯管理:新增,修改,删除,查询,分页 6、员工管理:新增,修改,删除,查询,分页,...