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

免费开源网站模板百度小程序平台

免费开源网站模板,百度小程序平台,网站开发员招聘,公司网站发展规划书利用自定义注解#xff0c;解决问题 例1 自定义注解限制请求 场景#xff1a;前端发起的频繁的请求#xff0c;导致服务器压力过大。需要对后端接口进行限流处理#xff0c;每个接口都需要做限流处理的话就会导致代码冗余#xff0c;此时就可以利用注解进行解决 非注解形…利用自定义注解解决问题 例1 自定义注解限制请求 场景前端发起的频繁的请求导致服务器压力过大。需要对后端接口进行限流处理每个接口都需要做限流处理的话就会导致代码冗余此时就可以利用注解进行解决 非注解形式 这里是用于 某个用户点击的次数结合radis进行判断也可以用请求的ip进行判断 核心代码 //限流,60秒5次ValueOperations valueOperations redisTemplate.opsForValue();String uri request.getRequestURI();//captcha 0; 这个用于测试Integer count (Integer) valueOperations.get(uri:user.getId());if(count null){valueOperations.set(uri:user.getId(),1,60,TimeUnit.SECONDS);} else if (count5) {valueOperations.increment(uri:user.getId());}else {return RespBean.error(RespBeanEnum.ACCESS_LIMIT_REAHCED);} 完整代码 RequestMapping(value /path,method RequestMethod.GET)ResponseBodypublic RespBean getPath(User user,Long goodsId,String captcha,HttpServletRequest request){if(user null){return RespBean.error(RespBeanEnum.SESSION_ERROR);}//限流,60秒5次ValueOperations valueOperations redisTemplate.opsForValue();String uri request.getRequestURI();log.info(uri:{},uri);log.info(qequestIp{},request.getRemoteAddr());log.info(LocalIp{},request.getLocalAddr());//captcha 0;Integer count (Integer) valueOperations.get(uri:user.getId());if(count null){valueOperations.set(uri:user.getId(),1,60,TimeUnit.SECONDS);} else if (count5) {valueOperations.increment(uri:user.getId());}else {return RespBean.error(RespBeanEnum.ACCESS_LIMIT_REAHCED);}boolean check orderService.checkCaptcha(user,goodsId,captcha);if(!check){return RespBean.error(RespBeanEnum.ERROR_CAPTCHA);}String str orderService.createPath(user,goodsId);return RespBean.success(str);} 注解形式 注解定义方式以AcessLimit为例 定义注解  AccessLimit 创建拦截器 AccessLimitInterceptor 在WebConfig 中添加拦截器 addInterceptors 定义注解AccessLimit Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface AccessLimit {//时间int second();//次数int maxCount();//这个用于判断是否需要登录后续可用SpringSecurity JWT 实现。boolean needLogin() default true; } 创建拦截器 AccessLimitInterceptor 核心代码 Component public class AccessLimitInterceptor implements HandlerInterceptor {Autowiredprivate RedisTemplate redisTemplate;Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if(handler instanceof HandlerMethod){HandlerMethod hm (HandlerMethod) handler;AccessLimit accessLimit hm.getMethodAnnotation(AccessLimit.class);if( accessLimit null){return true;}int second accessLimit.second();int maxCount accessLimit.maxCount();boolean needLogin accessLimit.needLogin();String key request.getRequestURI();ValueOperations valueOperations redisTemplate.opsForValue();Integer count (Integer) valueOperations.get(key);if(count null){valueOperations.set(key,1,second, TimeUnit.SECONDS);} else if (countmaxCount) {valueOperations.increment(key);} else {render(response,RespBeanEnum.ACCESS_LIMIT_REAHCED);return false;}}return true;} 完整代码 package com.xxx.seckilldemo.annotation;import com.fasterxml.jackson.databind.ObjectMapper; import com.xxx.seckilldemo.config.UserContext; import com.xxx.seckilldemo.pojo.User; import com.xxx.seckilldemo.service.IUserService; import com.xxx.seckilldemo.utils.CookieUtil; import com.xxx.seckilldemo.vo.RespBean; import com.xxx.seckilldemo.vo.RespBeanEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.ObjectInput; import java.io.PrintWriter; import java.util.concurrent.TimeUnit;/** 接口限流拦截器* author Adzc* date 2023/11/15 15:40*/ Component public class AccessLimitInterceptor implements HandlerInterceptor {Autowiredprivate IUserService userService;Autowiredprivate RedisTemplate redisTemplate;Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if(handler instanceof HandlerMethod){User user getUser(request,response);UserContext.setUser(user);HandlerMethod hm (HandlerMethod) handler;AccessLimit accessLimit hm.getMethodAnnotation(AccessLimit.class);if( accessLimit null){return true;}int second accessLimit.second();int maxCount accessLimit.maxCount();//此处是登录相关boolean needLogin accessLimit.needLogin();String key request.getRequestURI();if(needLogin){if (user null){render(response, RespBeanEnum.SESSION_ERROR);return false;}key:user.getId();}//在有效时间内次数的判断ValueOperations valueOperations redisTemplate.opsForValue();Integer count (Integer) valueOperations.get(key);if(count null){valueOperations.set(key,1,second, TimeUnit.SECONDS);} else if (countmaxCount) {valueOperations.increment(key);} else {//返回对象的定义render(response,RespBeanEnum.ACCESS_LIMIT_REAHCED);return false;}}return true;}/*** 获取当前用户* param request* param response* return*/private User getUser(HttpServletRequest request,HttpServletResponse response){String ticket CookieUtil.getCookieValue(request,userTicket);if (StringUtils.isEmpty(ticket)){System.out.println(没有获取到用户);return null;}return userService.getUserByCookie(ticket,request,response);}/*** 构建返回对象* param response* param respBeanEnum*/private void render(HttpServletResponse response,RespBeanEnum respBeanEnum) throws IOException {response.setContentType(application/json);response.setCharacterEncoding(utf-8);PrintWriter out response.getWriter();RespBean respBean RespBean.error(respBeanEnum);out.write(new ObjectMapper().writeValueAsString(respBean));out.flush();out.close();} }返回对象用到了枚举 /*** 公共返回对象* author Adzc* date 2023/9/25 23:19*/Data AllArgsConstructor NoArgsConstructor ToString public class RespBean {private long code;private String message;private Object obj;/*** 成功返回结果* return*/public static RespBean success(){return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(),null);}public static RespBean success(Object obj){return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(),obj);}/*** 失败返回结果* param respBeanEnum* return*/public static RespBean error(RespBeanEnum respBeanEnum){return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(),null);}public static RespBean error(RespBeanEnum respBeanEnum,Object obj){return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(),obj);} } Getter ToString AllArgsConstructor public enum RespBeanEnum {SUCCESS(200,SUCCESS),ERROR(500,服务端异常),//登录模块LOGIN_ERROR(500210,用户名或密码不正确),MOBILE_ERROR(500211,非法手机号),BIND_ERROR(500212,参数校验异常),MOBILE_NOT_EXIST(500213, 手机号不存在),PASSWORD_UPDATE_FAIL(500214,密码更新失败),SESSION_ERROR(500215,用户不存在),ACCESS_LIMIT_REAHCED(500504,访问过于频繁请稍后在尝试);private final Integer code;private final String message; } 在WebConfig 中添加拦截器 addInterceptors 核心代码 Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(accessLimitInterceptor);}} 完整代码 Configuration EnableWebMvc public class WebConfig implements WebMvcConfigurer {Autowiredprivate AccessLimitInterceptor accessLimitInterceptor;Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(accessLimitInterceptor);} } 例2 利用JsonSerialize注解自定义类进行手机号脱敏处理 场景很多手机号之类的信息需要在前端页面需要进行脱敏处理 public class PhoneJsonSerializer extends JsonSerializer {Overridepublic void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {if (value ! null value instanceof String){if (!Objects.equals(value,) value.toString().length() 5){String phone value.toString();phone phone.substring(0, 3) ****** phone.substring(phone.length() - 2);gen.writeString(phone);} else {gen.writeObject(value);}} else {gen.writeObject(value);}}} 在返回的对象中使用 JsonSerialize(using PhoneJsonSerializer.class)private String phone;
http://www.w-s-a.com/news/893296/

相关文章:

  • 全国新农村建设网站外包和劳务派遣哪个好
  • 网站权限控制什么软件做网站描述
  • 建网络商城网站wordpress关于
  • 专业网站建设分类标准重庆网站开发哪家专业
  • 织梦的网站关键词如何自己搭建微信小程序
  • 怎么做基金公司网站韩都衣舍网站建设ppt
  • 外贸网站模板aspnet网站开发 视频
  • 上海植物租赁做网站南浔网站建设
  • 怎么做学校网站做兼职工作上哪个网站招聘
  • 软件下载网站哪个比较好杭州开发小程序
  • 做网站都用什么技术学做名片的网站
  • 备案网站忘记密码乐装网
  • 电商扶贫网站建设淄博网站建设小程序
  • 网站群建设代理丰城网站建设公司
  • 青岛网站建设服务器wordpress迁移跳转原网站
  • 泰安网站建设哪里有公司如何注册网站
  • 做网站开专票税钱是多少个点上海市有哪些公司
  • 寿县有做网站开发的吗宁波网站建设方式
  • 网站建设和网站推广服务器怎么发布网站
  • 比较好的摄影网站雅安市政建设公司网站
  • 网站与微信区别wordpress 站内信
  • 宁夏网站开发设计说明书源码下载脚本之家
  • 邱县做网站百度搜索排名机制
  • 运城个人网站建设智慧团建系统官方网站登录
  • 公司营业执照可以做几个网站一家专门做母婴的网站
  • 网站建设商标属于哪个类别搜狗seo快速排名公司
  • 织梦做商城网站企业网络建站
  • 网站后期维护都有什么wordpress首页加图片
  • 展会网站怎么做网页设计与制作教程版徐洪亮课后答案
  • 石景山网站建设设计公司建设网站怎么建立服务器