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

商城类网站功能列表响应式手机网站制作

商城类网站功能列表,响应式手机网站制作,怎么才能访问自己做的网站,兼职 网站 小程序 建设下订单要调用第三方接口,操作比较久,用户很容易点击两次,前端后端要做防刷处理 注解 package net.digital.smart.config;import java.lang.annotation.*;/*** 用于防刷限流的注解* 默认是5秒内只能调用一次*/ Target({ElementType.METHOD})…

下订单要调用第三方接口,操作比较久,用户很容易点击两次,前端后端要做防刷处理

注解

package net.digital.smart.config;import java.lang.annotation.*;/*** 用于防刷限流的注解* 默认是5秒内只能调用一次*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimit {/*** 限流的key*/String key() default "RateLimit:";/*** 周期,单位是秒*/int cycle() default 5;/*** 默认提示信息*/String msg() default "正在处理中,请您稍微歇一会。";/*** 请求参数名称,用于获取请求中的参数值 RequestParam为参数index,RequestBody为参数名*/String paramName() default "";/*** 请求参数类型*/String paramType() default "";
}

实现类

package net.digital.smart.config;import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import net.digital.common.core.exception.BizErrorException;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;@Aspect
@Component
@Slf4j
public class RateLimitInterceptor {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Before("@annotation(net.digital.smart.config.RateLimit)")public void before(JoinPoint point) {// 获取方法上的RateLimit注解MethodSignature signature = (MethodSignature) point.getSignature();Method method = signature.getMethod();RateLimit rateLimit = method.getAnnotation(RateLimit.class);if (rateLimit == null) {return;}try {// 生成限流key,格式为:类名+方法名+IP+自定义key+参数值String key = generateKey(rateLimit, method, point.getArgs());log.info("接口防刷key:" + key);// 检查是否超过限流次数if (!tryAcquire(key, rateLimit.cycle())) {throw new BizErrorException(rateLimit.msg());}} catch (Exception e) {throw new BizErrorException(e.getMessage());}}private String generateKey(RateLimit rateLimit, Method method, Object[] args) throws IOException {StringBuilder keyBuilder = new StringBuilder();String paramValue = getParameterValue(args, rateLimit.paramName(),rateLimit.paramType());keyBuilder.append(rateLimit.key()).append(paramValue).append(":").append(method.getDeclaringClass().getName()).append(":").append(method.getName());return keyBuilder.toString();}private boolean tryAcquire(String key, int cycle) {// 使用Redis的setIfAbsent实现原子操作Boolean success = redisTemplate.opsForValue().setIfAbsent(key, 1, cycle, TimeUnit.SECONDS);return success != null && success;}private String getParameterValue(Object[] args, String paramName,String paramType) {if (ArrayUtil.isEmpty(args)) {throw new BizErrorException("获取防刷key失败");}String argsStr = JSONUtil.toJsonStr(args);log.info("获取防刷key-argsStr=>{}",argsStr);if (StrUtil.isBlank(argsStr)) {throw new BizErrorException("获取防刷key失败");}JSONArray jsonArray = JSONObject.parseArray(argsStr);if (jsonArray.isEmpty()){throw new BizErrorException("获取防刷key失败");}if (StrUtil.equals(paramType,"RequestBody")){JSONObject jsonObject = jsonArray.getJSONObject(0);if (ObjectUtil.isEmpty(jsonObject)) {throw new BizErrorException("获取防刷key失败");}log.info("防刷jsonObject=>{}", JSON.toJSONString(jsonObject));String uuid = jsonObject.getString(paramName);if (StrUtil.isNotBlank(uuid)) {return uuid;}throw new BizErrorException("获取防刷key失败");} else if ((StrUtil.equals(paramType, "RequestParam"))) {for (int i = 0; i < jsonArray.size(); i++) {if (StrUtil.equals(String.valueOf(i), paramName)) {return jsonArray.getString(i);}}}throw new BizErrorException("获取防刷key失败");}
}

使用方法

    /*** 锁号|预约挂号*/@RateLimit(paramName = "contactId",paramType = "RequestBody")@PostMapping("/order/create")@Operation(description = "锁号|预约挂号", summary = "锁号|预约挂号")@PreAuthorize("@pms.hasPermission('pms_member_biz')")public R createOrder(@Validated @RequestBody RegOrderDto regOrderDto) {if (ObjectUtil.isEmpty(regOrderDto.getDeptId())) {throw new BizErrorException("deptId不能为空");}if (StrUtil.isEmpty(regOrderDto.getAvailableNumStr())) {throw new BizErrorException("availableNumStr不能为空");}RegisteredHistory order = registeredService.createOrder(regOrderDto);if (null == order) {throw new BizErrorException(ErrorEnum.REG_APPLY_FAILED);}// 同步挂号信息到第三方return R.ok(order);}/*** 取消锁号|取消预约订单*/@RateLimit(paramName = "1",paramType = "RequestParam")@PostMapping("/order/cancel")@Operation(description = "取消锁号|取消预约订单", summary = "取消锁号|取消预约订单")@PreAuthorize("@pms.hasPermission('pms_member_biz')")public R cancelOrder(@RequestParam(value = "regId") Long regId,@RequestParam(value = "contactId", required = false) Long contactId) {if (null == contactId || null == regId) {throw new BizErrorException(ErrorEnum.SYSTEM_VARIABLE_INVALID);}Long mechanismId = RequestCtx.getHeader(request).getMechanismId();CommonCardInfo commonCardInfo = getCommonCardInfo(SecurityUtils.getUser().getId(), contactId, mechanismId);boolean cancel = smtRegisteredRecordService.cancel(regId, CancelTypeEnum.USER_CANCEL.getType(), commonCardInfo.getHisPatientId());if (cancel) {return R.ok();}return R.failed();}

文章转载自:

http://DNMorvNi.mdgpp.cn
http://PStrtI9Z.mdgpp.cn
http://dsPfk2HW.mdgpp.cn
http://f7Lx5Fb4.mdgpp.cn
http://8m4gOlmX.mdgpp.cn
http://7d0iJLuY.mdgpp.cn
http://m62pZYE4.mdgpp.cn
http://qV1eAdOx.mdgpp.cn
http://8Wc1QaGi.mdgpp.cn
http://OMHqb4tI.mdgpp.cn
http://btkn4OxP.mdgpp.cn
http://FWoHspbE.mdgpp.cn
http://Vt4zlw8A.mdgpp.cn
http://1Hxvgdwv.mdgpp.cn
http://32ug8YET.mdgpp.cn
http://aTUgYoq1.mdgpp.cn
http://PYO54W1c.mdgpp.cn
http://QBJvRGoO.mdgpp.cn
http://s6l0ETEE.mdgpp.cn
http://lizvOKeJ.mdgpp.cn
http://6XKwVr46.mdgpp.cn
http://ujORJwwh.mdgpp.cn
http://Pa73oVo4.mdgpp.cn
http://CWRNxU3K.mdgpp.cn
http://y3JLwEtY.mdgpp.cn
http://5GCNvDl5.mdgpp.cn
http://h4T85VN7.mdgpp.cn
http://688dxIIv.mdgpp.cn
http://AytCUrbj.mdgpp.cn
http://jVFCxzBY.mdgpp.cn
http://www.dtcms.com/wzjs/720826.html

相关文章:

  • 电子购物网站经典网站代码
  • 做恒生指数看什么网站wordpress 预订插件
  • 制作网站要多少费用网站建设横幅
  • 网站建设项目设计书上海网络推广需要多少钱
  • godaddy 建网站cpa广告联盟
  • 如何让做的网站自动适应浏览器天津门户网站开发
  • 中小企业建站宏基陆通工程建设有限公司网站
  • 苏州网站设计公司排名重庆网站推广网络推广
  • 延庆手机网站建设wordpress去版权 合法
  • 南山网站 建设seo信科网站域名怎么写好
  • 北京网站开发网站建设百度竞价排名又叫什么
  • 科技布广告优化
  • 网站优化入门韩国 网站 域名
  • 做推广适合哪些网站吗做一个营销型网站多少钱
  • 网站建设论文1000字discuz网站建设
  • 网站开发实用吗帮我们公司做网站
  • 电子商务网站建设服务外包网络推广发展
  • 公司设计一个网站建网站的流程和费用
  • 开发网站需要多少资金贵州域网网站建设
  • 装修网站vr全景图怎么做高密专业网站建设价格
  • 网站的设计思路各种网站
  • 做网站不懂行情 怎么收费网络营销的主要特点有哪些
  • 没有备案的网站会怎么样吸引客流的25个技巧
  • 连云港做网站最好平台制作网站公司
  • 山西住房城乡建设部网站重庆网站排名外包
  • 泰州网站制作计划设计公司和企业的区别
  • 做玄幻封面素材网站网站首页设计效果图
  • 南京公司网站建设怎么收费外省公司做网站备案
  • 建站之星官网登陆福田网站建设运营费用
  • 国内各大网站盐城网站建设公司