杭州建设行业网站现在学ui吃香吗

diannao/2026/1/23 23:52:05/文章来源:
杭州建设行业网站,现在学ui吃香吗,谈谈你在建设主题资源网站时,企业做网站乐云seo快速上线背景 这里介绍一下本文的背景#xff08;废话#xff0c;可跳过#xff09;。上周有个我们服务的调用方反馈某个接口调用失败率很高#xff0c;排查了一下#xff0c;发现是因为这个接口被我之前写的一个限流器给拦截了#xff0c;随着我们的服务接入了 Sentinel#x…背景 这里介绍一下本文的背景废话可跳过。上周有个我们服务的调用方反馈某个接口调用失败率很高排查了一下发现是因为这个接口被我之前写的一个限流器给拦截了随着我们的服务接入了 Sentinel这个 限流器也可以下线了。于是今天又看了一下当初了实现发现实现的很粗糙核心还是基于 Spring AOP 实现的。 又突然想起前段时间由于某些原因想过下掉我们服务中使用的 Shiro因为只是因为要使用 Shiro 的鉴权 RequiresPermissions就要单独引入一个框架有点重。感觉这种鉴权完全可以自己实现那怎么实现呢脑子第一印象又是 Spring AOP。 这里就陷入了一种误区啥事都用 Spring AOP。Spring AOP 的实现会依赖动态代理无论是使用 JDK 动态代理还是 CGLIB 动态代理都会有一定的性能开销。但其实在 Web 端很多功能都是可以避免使用 Spring AOP 减少无意义的性能损耗比如上面提到的限流和鉴权。 抽象实现 其实原理很简单就是基于 HandlerInterceptor 来做。但由于类似的功能会很多比如限流、鉴权、日志打印等可以将相关功能进行抽象便于后续类似功能快速实现。 核心抽象类 package blog.dongguabai.spring.web.mvc.handlerinterceptor.core;import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.annotation.Annotation; import java.lang.reflect.ParameterizedType; import java.util.Objects;/*** author dongguabai* date 2023-11-19 23:43*/ public abstract class CustomizedHandlerMethodInterceptorA extends Annotation implements HandlerInterceptor {private final ClassA annotationType;protected CustomizedHandlerMethodInterceptor() {ParameterizedType superclass (ParameterizedType) getClass().getGenericSuperclass();this.annotationType (ClassA) superclass.getActualTypeArguments()[0];}protected abstract boolean preHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, A annotation) throws Exception;protected abstract void afterCompletion(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, A annotation, Exception ex) throws Exception;protected abstract void postHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, ModelAndView modelAndView, A annotation) throws Exception;Overridepublic final boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {A annotation getAnnotation((HandlerMethod) handler);if (match(annotation)) {return preHandle(request, response, (HandlerMethod) handler, annotation);}}return true;}Overridepublic final void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {if (handler instanceof HandlerMethod) {A annotation getAnnotation((HandlerMethod) handler);if (match(annotation)) {postHandle(request, response, (HandlerMethod) handler, modelAndView, annotation);}}}Overridepublic final void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {if (handler instanceof HandlerMethod) {A annotation getAnnotation((HandlerMethod) handler);if (match(annotation)) {afterCompletion(request, response, (HandlerMethod) handler, annotation, ex);}}}protected A getAnnotation(HandlerMethod handlerMethod) {return handlerMethod.getMethodAnnotation(annotationType);}protected boolean match(A annotation) {return Objects.nonNull(annotation);}}接下来其他的业务功能只需要定义注解后编写拦截器继承 CustomizedHandlerMethodInterceptor 即可。 业务快速实现鉴权 定义注解 package blog.dongguabai.spring.web.mvc.handlerinterceptor.require;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** author Dongguabai* description* date 2023-11-19 23:31*/ Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) Documented public interface RequiresPermissions {// PermissionsString[] value(); }拦截器实现 package blog.dongguabai.spring.web.mvc.handlerinterceptor.require;import blog.dongguabai.spring.web.mvc.handlerinterceptor.RequestContext; import blog.dongguabai.spring.web.mvc.handlerinterceptor.core.CustomizedHandlerMethodInterceptor; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.List;/*** author dongguabai* date 2023-11-19 23:34*/ Component public class RequiresPermissionsHandlerMethodInterceptor extends CustomizedHandlerMethodInterceptorRequiresPermissions {Overrideprotected boolean preHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, RequiresPermissions annotation) throws Exception {ListString permissons Arrays.asList(annotation.value());if (RequestContext.getCurrentUser().getPermissions().stream().anyMatch(permissons::contains)){return true;}System.out.println(无权限.....);return false;}Overrideprotected void afterCompletion(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, RequiresPermissions annotation, Exception ex) throws Exception {}Overrideprotected void postHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, ModelAndView modelAndView, RequiresPermissions annotation) throws Exception {} }也就是说标注了 RequiresPermissions 注解的接口都会进行鉴权。 验证一下 package blog.dongguabai.spring.web.mvc.handlerinterceptor;import blog.dongguabai.spring.web.mvc.handlerinterceptor.require.RequiresPermissions; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;/*** author dongguabai* date 2023-11-20 00:17*/ RestController public class TestController {//只有拥有 BOSS 权限的用户才能调用GetMapping(/get-reports)RequiresPermissions(BOSS)public String getReports() {return ALL...;} }模拟当前登陆用户无 BOSS 权限 package blog.dongguabai.spring.web.mvc.handlerinterceptor;import java.util.Arrays;/*** author dongguabai* date 2023-11-20 01:21*/ public final class RequestContext {public static User getCurrentUser() {User user new User();user.setUsername(tom);user.setPermissions(Arrays.asList(ADMIN, STUDENT));return user;} }调用 ➜ github curl http://localhost:8080/get-reports {message:无权限...}% 即拦截成功。 业务快速实现限流 定义注解 package blog.dongguabai.spring.web.mvc.handlerinterceptor.canyon;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.concurrent.TimeUnit;/*** author dongguabai* date 2023-11-20 01:56*/ Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) Documented public interface Canyon {double value();long timeout() default 0;TimeUnit timeunit() default TimeUnit.SECONDS;String message() default 系统繁忙,请稍后再试.; }实现拦截器 package blog.dongguabai.spring.web.mvc.handlerinterceptor.canyon;import blog.dongguabai.spring.web.mvc.handlerinterceptor.RequestContext; import blog.dongguabai.spring.web.mvc.handlerinterceptor.core.CustomizedHandlerMethodInterceptor; import blog.dongguabai.spring.web.mvc.handlerinterceptor.require.RequiresPermissions; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.Map;/*** author dongguabai* date 2023-11-19 23:34*/ Component public class CanyonHandlerMethodInterceptor extends CustomizedHandlerMethodInterceptorCanyon {Overrideprotected boolean preHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Canyon annotation) throws Exception {if (tryAcquire()) {return true;}response.setContentType(application/json);response.setCharacterEncoding(UTF-8);response.getWriter().write(String.format({\message\:\%s\}, annotation.message()));return false;}Overrideprotected void afterCompletion(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Canyon annotation, Exception ex) throws Exception {}Overrideprotected void postHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, ModelAndView modelAndView, Canyon annotation) throws Exception {}/*** todo:流量控制逻辑*/private boolean tryAcquire() {return false;} }验证一下 package blog.dongguabai.spring.web.mvc.handlerinterceptor;import blog.dongguabai.spring.web.mvc.handlerinterceptor.canyon.Canyon; import blog.dongguabai.spring.web.mvc.handlerinterceptor.require.RequiresPermissions; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;/*** author dongguabai* date 2023-11-20 00:17*/ RestController public class TestController {GetMapping(/get-reports)RequiresPermissions(BOSS)public String getReports() {return ALL...;}GetMapping(/search)RequiresPermissions(ADMIN)Canyon(1)public String search() {return search...;} }调用 ➜ github curl http://localhost:8080/search {message:系统繁忙,请稍后再试.}% 即限流成功。 总结 本文首先阐述了虽然 Spring AOP 可以实现限流、鉴权等需要代理的功能但由于依赖动态代理会带来一定的性能损耗。然后通过对 HandlerInterceptor 的抽象我们实现了一套在 Spring Web MVC 层面的静态代理机制从而方便快速地在 Web 端实现代理功能。 欢迎关注公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/88845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么在网站做浮动图标网站点击率如何做

在工业自动化行业呆过的朋友大都接触过不同厂家的相机,而机器视觉系统使用不同品牌的相机主要有以下几点原因: 性能和功能:不同品牌的相机在性能和功能方面可能有所区别。某些应用场景需要高分辨率、高速度、低噪声等特性,而其他应用则可能更关注相机的灵活性、接口类型、图…

手机兼职在哪个网站做装修队伍做网站

文章目录 写在前面实验描述实验框架实验需求 实验内容1.安装依赖库2.创建Scrapy项目3.配置系统设置4.配置管道文件5.连接数据库6.分析要爬取的内容7.编写爬虫文件 运行结果写在后面 写在前面 本期内容:基于scrapymysql爬取博客信息并保存到数据库中 实验需求 ana…

开发网站找什么公司吗做女装的网站有哪些

其实在C中,运算符也是一种函数,有自己的类型,有自己的参数,有自己的返回值。 下面就是重载的方法: struct vec {int x;int y; }; vec operator(const vec &a,const vec &b) //括号里面的是参数 {vec temp;temp…

网站建设与管理需要什么软件有哪些方面岳池发展建设集团有限公司门户网站

文章目录 1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工…

河南省汝州市建设网站服务器网站目录

Harbor概述 1.Harbor定义 私有,自定义用户的形式登陆仓库,拉取或者上传镜像。(内部管理的用户) Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。 2.Docker Harbor…

嘉兴网站建设的前景网站推广公司兴田德润在哪儿

学习目标: 每天复习代码随想录上的题目1-2道算法(时间充足可以继续) 今日碎碎念: 1)今天开始是二叉树系列 2)出租屋里不知道干啥,看看书啊刷刷算法,打打游戏,学学技术…

外贸网站建设注意苏州知名网站建设定制

传送门 文章目录题意:思路:题意: 思路: 首先一个括号序列合法的条件可以转化成两个(左括号代价为111,右括号代价为−1-1−1): (1) 左括号个数等于右括号个数。 (2) 括号的前缀和非负。 所以我们直接用线段…

网站建设创业规划书网站收款接口

最近遇到一个问题,虽然应用层使用的系统调用send已经返回成功,而且没有错误日志产生,也没有errno的设置。那是不是代表一定是没有问题?从抓包的结果看,虽然上层应用已经显示发出去,但是实际抓包的时候&…

表情包制作网站与别人相比自己网站建设优势

在使用阿里云OSS进行前端直传时,首先我们需要去阿里云官网注册自己的存储桶,然后申请相关的accessKeyId和accessKeySecret,然后新建一个桶,为这个桶命名以及选择对应的地区。 然后可以根据自己的业务,封装对应的组件&a…

个人网站备案名称例子乐清门户网站建设

上一节讲解了IDEA如何连接MySQL数据库管理系统,接下来我们就可以在IDEA里使用MySQL来管理数据库了。那么如果我们现在还没有创建需要的数据库怎么办?本节就来教大家如何在IDEA连接MySQL后管理数据库(创建/修改/删除数据库、创建/修改/删除表、插入/更新/…

建立网站备案的法律依据一个专做里番的网站

你想在这里做两件事 . 我假设您正在使用Oracle(因为您正在使用Java) .首先,您希望对每个用户的每日交易进行分组 .创建一个名为 tempTable 的临时表 .使用 to_char(currentdate, yyyy/mm/dd) 对它们进行分组 .INSERT INTO tempTableSELECTuserid,resourceid,doc_nam…

学校做网站及费用联通营业厅做网站维护

​随着人们生活水平的提高,对食品安全的要求也越来越高。在这种背景下,机器视觉技术作为一种高效、准确的自动化检测手段,在食品安全检测领域扮演着越来越重要的角色。机器视觉系统通过模拟人眼的视觉功能,借助相机和计算机视觉算…

手机网站解析地址珠海网站开发软件

本小节将以应用市场首页为例,介绍如何使用自适应布局能力和响应式布局能力适配不同尺寸窗口。 页面设计 一个典型的应用市场首页的UX设计如下所示。 观察应用市场首页的页面设计,不同断点下的页面设计有较多相似的地方。 据此,我们可以将页…

免费做企业网站南京市建设工程档案馆网站

备注:记录一次spring-boot redis 配置redis.database后,仍然使用db0默认库的情况。 springboot集成redis及相关问题 1. spring boot集成redisredis集成依赖:redis配置序列化 2. 集成redission redis分布式锁等快捷管理工具集成依赖配置注入…

网站app的意义网站建设同步视频

一.题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 算法1.排序,然后遍历,时间复杂度O(nlogn),空…

网站建设报价单-中英文版joomla drupal wordpress

登录功能 手机号验证码都通过后端验证后 返回用户数据 登陆成功 成功后 调用store中的setUser方法 store中的setUser方法 将后端返回的用户信息存储到localStorage中 同时登录成功后服务器会将token自动存入我们的cookie中 有过期时间 在我们请求需要登录的接口时将cookie中的…

h5网站的好处做猎头顾问 经常看哪些网站

转 一:出行大数据,滴滴发布400城数据可视化分析 2018年01月04日 00:00:00 https://blog.csdn.net/zw0Pi8G5C1x/article/details/78976493 二:滴滴背后的大数据应用 前言:这是一篇大数据应用文章,不涉及高深技术&#…

北京酒店团购网站建设wordpress静态化链接

一、DTD介绍 Document Type Definition; DTD是一种XML的约束方式,除了此种约束方式外,还有XSchema,XSchema比DTD的约束能力还要强,因此DTD正在逐渐淘汰; DTD的目的就是约束XML标签的写法;比如在…

网站开发什么语言比较好gpu服务器租用价格

点击上方蓝字关注我们WTM5.0全面支持.net5WTM5.0是WTM框架开源2年以来最大的一次升级,全面支持.net5,大幅重构了底层代码,针对广大用户提出的封装过度,不够灵活,性能不高等问题进行了彻底的修改。这次升级使WTM继续保持…