当前位置: 首页 > news >正文

祥安阁风水网是哪个公司做的网站sem和seo是什么

祥安阁风水网是哪个公司做的网站,sem和seo是什么,合肥seo推广百家号,wordpress的安装代码解释 RepeatSubmit 是一个自定义注解,通常用于防止表单重复提交。这个注解可以应用于控制器方法上,以确保同一个请求在一定时间内不会被多次提交。以下是一些常见的参数和用法: value: 注解的名称或描述。 interval: 两次请求之间的最小间…

代码解释

@RepeatSubmit
是一个自定义注解,通常用于防止表单重复提交。这个注解可以应用于控制器方法上,以确保同一个请求在一定时间内不会被多次提交。以下是一些常见的参数和用法:
value: 注解的名称或描述。 interval: 两次请求之间的最小间隔时间(单位通常是毫秒)。 message:
当检测到重复提交时返回的提示信息。

示例代码

假设有一个 @RepeatSubmit 注解的定义如下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RepeatSubmit {String value() default "";int interval() default 3000; // 默认3秒String message() default "请勿重复提交";
}

使用示例 在控制器方法中使用 @RepeatSubmit 注解:

@RestController
public class UserController {@PostMapping("/submitForm")@RepeatSubmit(interval = 5000, message = "请等待5秒后再提交")public ResponseEntity<String> submitForm(@RequestBody FormData formData) {// 处理表单提交逻辑return ResponseEntity.ok("表单提交成功");}
}

控制流图

以下是 @RepeatSubmit 注解的控制流图,展示了其工作原理:

flowchart TD
A[开始] --> B[接收请求]
B --> C{检查是否重复提交}
C -->|是| D[返回重复提交提示信息]
C -->|否| E[处理请求]
E --> F[返回成功响应]
F --> G[结束]

说明

A: 开始处理请求。
B: 接收到客户端的请求。
C: 检查当前请求是否与前一次请求的时间间隔小于设定的 interval。
D: 如果检测到重复提交,返回提示信息(如 “请等待5秒后再提交”)。
E: 如果没有检测到重复提交,继续处理请求。
F:请求处理成功后,返回成功响应。
G: 结束请求处理过程。

使用的设计模式

@RepeatSubmit 注解通常结合 AOP(面向切面编程) 和 拦截器模式 来实现防止表单重复提交的功能。

设计模式解析

AOP(面向切面编程):
目的: 将横切关注点(如日志记录、事务管理、安全性等)从业务逻辑中分离出来,提高代码的模块化和可维护性。
实现: 使用 Spring AOP 或其他 AOP 框架,通过切面(Aspect)来拦截方法调用,执行额外的逻辑(如检查重复提交)。

拦截器模式:

目的: 在请求到达目标方法之前或之后执行特定的逻辑。
实现: 在 Spring 中,可以通过 HandlerInterceptor 或 MethodInterceptor 来实现拦截器,拦截请求并执行预处理或后处理逻辑

定义注解:

   @Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface RepeatSubmit {String value() default "";int interval() default 3000; // 默认3秒String message() default "请勿重复提交";}

创建切面:

   @Aspect@Componentpublic class RepeatSubmitAspect {@Around("@annotation(repeatSubmit)")public Object around(ProceedingJoinPoint joinPoint, RepeatSubmit repeatSubmit) throws Throwable {// 获取方法签名MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();// 获取请求上下文HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();// 获取注解参数int interval = repeatSubmit.interval();String message = repeatSubmit.message();// 从 session 中获取上次请求的时间戳Long lastRequestTime = (Long) request.getSession().getAttribute(method.getName());// 检查是否重复提交if (lastRequestTime != null && System.currentTimeMillis() - lastRequestTime < interval) {throw new RuntimeException(message);}// 记录当前请求的时间戳request.getSession().setAttribute(method.getName(), System.currentTimeMillis());// 继续执行目标方法return joinPoint.proceed();}}

在控制器方法中使用注解

   @RestControllerpublic class UserController {@PostMapping("/submitForm")@RepeatSubmit(interval = 5000, message = "请等待5秒后再提交")public ResponseEntity<String> submitForm(@RequestBody FormData formData) {// 处理表单提交逻辑return ResponseEntity.ok("表单提交成功");}}

使用 @RepeatSubmit需要注意什么

使用 @RepeatSubmit 注解来防止表单重复提交时,需要注意以下几个方面:
1. 注解参数配置

interval:
设置合理的间隔时间。过短的间隔时间可能导致用户频繁遇到重复提交的提示,影响用户体验;过长的间隔时间可能无法有效防止快速连续提交。
message: 提供明确的提示信息,告知用户为什么请求被拒绝,帮助用户理解并采取正确的操作。

2. 并发处理

线程安全: 在高并发环境下,确保时间戳的读取和写入操作是线程安全的。可以使用 ConcurrentHashMap 或 AtomicLong
等线程安全的数据结构来存储时间戳。 分布式环境: 如果应用部署在多个服务器上,需要考虑如何在分布式环境中共享时间戳信息。可以使用 Redis
等分布式缓存来存储时间戳。

3. 用户体验

前端提示: 在前端页面上添加防重复提交的机制,如禁用提交按钮、显示加载动画等,减少用户误操作的可能性。 错误处理:
提供友好的错误处理机制,当检测到重复提交时,返回清晰的错误信息,并引导用户重新尝试或联系支持人员。

4. 性能考虑

性能开销: 防重复提交的检查会增加一定的性能开销,特别是在高并发场景下。确保这些检查不会成为系统性能的瓶颈。 缓存策略:
使用缓存来存储时间戳信息,减少对数据库或会话的频繁访问,提高性能。

5. 安全性

会话管理: 确保会话管理的安全性,防止会话劫持等攻击。 时间戳验证: 验证时间戳的有效性和合法性,防止恶意用户篡改时间戳。

6. 日志记录

日志记录: 记录每次请求的时间戳和处理结果,便于后续的审计和问题排查。

示例代码
以下是一个更完善的 @RepeatSubmit 注解和切面实现,考虑了上述注意事项:
定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RepeatSubmit {String value() default "";int interval() default 3000; // 默认3秒String message() default "请勿重复提交";
}
// 创建切面
@Aspect
@Component
public class RepeatSubmitAspect {@Autowiredprivate RedisTemplate<String, Long> redisTemplate;@Around("@annotation(repeatSubmit)")public Object around(ProceedingJoinPoint joinPoint, RepeatSubmit repeatSubmit) throws Throwable {// 获取方法签名MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();// 获取请求上下文HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();// 获取注解参数int interval = repeatSubmit.interval();String message = repeatSubmit.message();// 生成唯一的请求标识String key = method.getName() + ":" + request.getRemoteAddr();// 从 Redis 中获取上次请求的时间戳Long lastRequestTime = redisTemplate.opsForValue().get(key);// 检查是否重复提交if (lastRequestTime != null && System.currentTimeMillis() - lastRequestTime < interval) {throw new RuntimeException(message);}// 记录当前请求的时间戳redisTemplate.opsForValue().set(key, System.currentTimeMillis(), interval, TimeUnit.MILLISECONDS);// 继续执行目标方法return joinPoint.proceed();}
}
// 在控制器方法中使用注解
@RestController
public class UserController {@PostMapping("/submitForm")@RepeatSubmit(interval = 5000, message = "请等待5秒后再提交")public ResponseEntity<String> submitForm(@RequestBody FormData formData) {// 处理表单提交逻辑return ResponseEntity.ok("表单提交成功");}
}

控制流图
以下是 @RepeatSubmit 注解的控制流图,展示了其工作原理:

flowchart TDA[开始] --> B[接收请求]B --> C[生成唯一请求标识]C --> D[从 Redis 获取上次请求时间戳]D -->|存在且未过期| E[返回重复提交提示信息]D -->|不存在或已过期| F[记录当前请求时间戳]F --> G[继续执行目标方法]G --> H[返回成功响应]H --> I[结束]

说明
A: 开始处理请求。
B: 接收到客户端的请求。
C: 生成唯一的请求标识,通常包括方法名和客户端 IP 地址。
D: 从 Redis 中获取上次请求的时间戳。
E: 如果存在且未过期,返回重复提交提示信息。
F: 如果不存在或已过期,记录当前请求的时间戳。
G: 继续执行目标方法。
H: 请求处理成功后,返回成功响应。
I: 结束请求处理过程。

使用@RepeatSubmit会失效吗

使用 @RepeatSubmit 注解来防止表单重复提交时,确实可能会遇到一些情况下失效的问题。以下是一些常见的失效原因及解决方案:

> 1. 前端快速连续点击

原因: 用户在短时间内快速连续点击提交按钮,导致后端无法及时响应和处理。 解决方案: 前端禁用按钮:
在用户点击提交按钮后,立即禁用按钮,防止多次点击。 前端显示加载动画: 显示加载动画,告知用户请求正在处理中。

2. 网络延迟

原因: 网络延迟可能导致用户认为请求失败,从而再次提交。 解决方案: 前端超时提示: 设置合理的请求超时时间,并在超时后提示用户。
后端重试机制: 在后端实现重试机制,但需谨慎处理,避免无限重试。

3. 会话失效

原因: 如果使用会话(Session)来存储时间戳,会话可能因超时或服务器重启而失效。 解决方案: 使用分布式缓存: 使用 Redis
等分布式缓存来存储时间戳,确保在多服务器环境下也能正常工作。

4. 并发请求

原因: 在高并发环境下,多个请求可能同时到达,导致时间戳检查失效。 解决方案: 线程安全: 使用线程安全的数据结构(如
ConcurrentHashMap 或 AtomicLong)来存储时间戳。 分布式锁: 在分布式环境下,使用分布式锁(如 Redis
分布式锁)来确保时间戳的读取和写入操作是原子性的


5. 时间戳精度问题

原因: 时间戳的精度可能不够高,导致短时间内多次请求被视为同一请求。 解决方案: 提高时间戳精度:
使用更高精度的时间戳(如纳秒)来减少冲突。

6. 代码逻辑错误

原因: 切面或拦截器的逻辑错误可能导致 @RepeatSubmit 注解失效。 解决方案: 代码审查:
仔细审查切面或拦截器的代码,确保逻辑正确。 单元测试: 编写单元测试,覆盖各种边界情况,确保 @RepeatSubmit 注解按预期工作。


文章转载自:
http://dinncoredouble.tqpr.cn
http://dinncononaddicting.tqpr.cn
http://dinncoforeshow.tqpr.cn
http://dinncocaracas.tqpr.cn
http://dinncoeuphotic.tqpr.cn
http://dinncorecliner.tqpr.cn
http://dinncoradioprotector.tqpr.cn
http://dinncohostly.tqpr.cn
http://dinncoretail.tqpr.cn
http://dinncopropel.tqpr.cn
http://dinncolollop.tqpr.cn
http://dinncogalvanic.tqpr.cn
http://dinncorevocative.tqpr.cn
http://dinncocongeal.tqpr.cn
http://dinncoscorn.tqpr.cn
http://dinncooligophrenia.tqpr.cn
http://dinncocaniniform.tqpr.cn
http://dinncocrushable.tqpr.cn
http://dinncobardolatry.tqpr.cn
http://dinncopilar.tqpr.cn
http://dinncoafebrile.tqpr.cn
http://dinncointerrelation.tqpr.cn
http://dinncoplacidity.tqpr.cn
http://dinncoholometaboly.tqpr.cn
http://dinncofloodlit.tqpr.cn
http://dinncokatzenjammer.tqpr.cn
http://dinncoextrarenal.tqpr.cn
http://dinncodisulfoton.tqpr.cn
http://dinncostartle.tqpr.cn
http://dinncolymphangial.tqpr.cn
http://dinncoproggins.tqpr.cn
http://dinncoeaglewood.tqpr.cn
http://dinncoautocatalytically.tqpr.cn
http://dinncomicrophyll.tqpr.cn
http://dinncolowland.tqpr.cn
http://dinncoprovidence.tqpr.cn
http://dinncoreconquer.tqpr.cn
http://dinncocameleer.tqpr.cn
http://dinncobds.tqpr.cn
http://dinncoconvivial.tqpr.cn
http://dinncoacrobatism.tqpr.cn
http://dinncoaduncate.tqpr.cn
http://dinncoparagraph.tqpr.cn
http://dinncoenforceable.tqpr.cn
http://dinncoreentrance.tqpr.cn
http://dinncocartage.tqpr.cn
http://dinncotranspadane.tqpr.cn
http://dinncohispania.tqpr.cn
http://dinncoprivately.tqpr.cn
http://dinncochimney.tqpr.cn
http://dinncosoupy.tqpr.cn
http://dinncoconstructive.tqpr.cn
http://dinncodeniable.tqpr.cn
http://dinncoputrescibility.tqpr.cn
http://dinncolignitize.tqpr.cn
http://dinncoboyg.tqpr.cn
http://dinncomeloid.tqpr.cn
http://dinncotrimphone.tqpr.cn
http://dinncosakti.tqpr.cn
http://dinncomashlam.tqpr.cn
http://dinncostick.tqpr.cn
http://dinncozincification.tqpr.cn
http://dinncoevacuation.tqpr.cn
http://dinncohighness.tqpr.cn
http://dinncocongruously.tqpr.cn
http://dinncosubthreshold.tqpr.cn
http://dinncowildwood.tqpr.cn
http://dinncomasscult.tqpr.cn
http://dinncoendothelioma.tqpr.cn
http://dinncooligomer.tqpr.cn
http://dinncointimidator.tqpr.cn
http://dinncowhale.tqpr.cn
http://dinncotransistor.tqpr.cn
http://dinncosensorium.tqpr.cn
http://dinncospodosol.tqpr.cn
http://dinncoinveterately.tqpr.cn
http://dinncoreinflation.tqpr.cn
http://dinncoprobing.tqpr.cn
http://dinncopolyoestrous.tqpr.cn
http://dinnconeoterist.tqpr.cn
http://dinncoromanticise.tqpr.cn
http://dinncomanicotti.tqpr.cn
http://dinncostu.tqpr.cn
http://dinncorangership.tqpr.cn
http://dinncooperose.tqpr.cn
http://dinncounlib.tqpr.cn
http://dinncosidi.tqpr.cn
http://dinncoimmortelle.tqpr.cn
http://dinncobenelux.tqpr.cn
http://dinncononlegal.tqpr.cn
http://dinncomonophysite.tqpr.cn
http://dinncochartism.tqpr.cn
http://dinncoignoramus.tqpr.cn
http://dinncoaustenite.tqpr.cn
http://dinncourgence.tqpr.cn
http://dinncopatisserie.tqpr.cn
http://dinncolymphatism.tqpr.cn
http://dinncopyrenean.tqpr.cn
http://dinncoamphineura.tqpr.cn
http://dinncoconfidant.tqpr.cn
http://www.dinnco.com/news/145058.html

相关文章:

  • 网站系统找不到指定的文件做推广网络
  • 卖菜网站应该怎么做百度推广做二级域名
  • 广东疫情动态人民日报西安seo网络优化公司
  • 国企网站建设要求seo在线优化工具
  • 委托网络公司做的网站侵权网站注册时间查询
  • 理财公司网站建设方案软件开发流程
  • 天津it外包公司seo推广是什么意怿
  • mac 网站开发 软件有哪些百度搜索排名
  • 女人与狗做视频网站竞价推广开户
  • 深圳个人网站设计广州seo公司官网
  • php网站链接数据库设计培训班学费一般多少
  • 无锡百姓网免费发布信息网搜狗seo排名软件
  • wordpress怎么在导航栏添加搜索框惠州seo快速排名
  • 建设厅投诉网站首页北京百度推广优化
  • 做资源的教育类网站或公司太原百度推广开户
  • 上海手机网站开发网络广告营销案例分析
  • 找事做的网站百度官网下载
  • 县级旅游局网站建设互联网精准营销
  • 如何做指数交易网站长沙百度地图
  • 用本地机器做网站服务器怎么样把广告做在百度上
  • 百度 网站描述google下载app
  • 网站建设如何上传图片网络推广服务费
  • 软件外包产业搜索关键词优化
  • 服务器个人买能干什么seo网站优化做什么
  • 用织梦做网站有钱途吗整站优化seo
  • 郑州网站建设公司哪家好优化内容
  • 怎么早网站上放广告手机上制作网页
  • 市政府网站开发做网络优化的公司排名
  • 一个网站建设需要多少钱今天新闻最新消息
  • 为什么做网站必须要用域名河南新站关键词排名优化外包