如何设置网站服务器访问权限怎样做网站软件

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

如何设置网站服务器访问权限,怎样做网站软件,单页关键词优化费用,淮阳住房和城乡建设局网站两种方法#xff0c; 一种是后端实现#xff0c;较复杂#xff0c;要通过自定义注解和AOP以及Redis组合实现 另一种是前端实现#xff0c;简单#xff0c;只需通过js#xff0c;设置过期时间#xff0c;一定时间内#xff0c;多次点击按钮只生效一次 后端实现 自定义注… 两种方法 一种是后端实现较复杂要通过自定义注解和AOP以及Redis组合实现 另一种是前端实现简单只需通过js设置过期时间一定时间内多次点击按钮只生效一次 后端实现 自定义注解AOPRedis 自定义注解 package com.wzw.config.anno;import java.lang.annotation.;/** 自定义注解防止表单重复提交/ Target(ElementType.METHOD) // 注解只能用于方法 Retention(RetentionPolicy.RUNTIME) // 修饰注解的生命周期 Documented public interface RepeatSubmit {/** 防重复操作过期时间,默认1s/long expireTime() default 1; } AOP package com.wzw.config.aspect;import com.wzw.config.anno.RepeatSubmit; import com.wzw.config.exception.CustomException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; 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 javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit;/** 防止重复提交切面/ Slf4j Component Aspect public class RepeatSubmitAspect {Autowiredprivate RedisTemplate redisTemplate;/** 定义切点/Pointcut(annotation(com.wzw.config.anno.RepeatSubmit))public void repeatSubmit() {}Around(repeatSubmit())public Object around(ProceedingJoinPoint joinPoint) throws Throwable {ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request attributes.getRequest();Method method ((MethodSignature) joinPoint.getSignature()).getMethod();// 获取防重复提交注解RepeatSubmit annotation method.getAnnotation(RepeatSubmit.class);// 获取token当做keyString token request.getHeader(token);if (StringUtils.isBlank(token)) {throw new RuntimeException(token不存在请登录);}String url request.getRequestURI();/** 通过前缀 url token 来生成redis上的 key* 可以在加上用户id小编这里没办法获取大家可以在项目中加上/String redisKey repeat_submit_key:.concat(url).concat(token);log.info(redisKey {},redisKey);if (!redisTemplate.hasKey(redisKey)) {redisTemplate.opsForValue().set(redisKey, redisKey, annotation.expireTime(), TimeUnit.SECONDS);try {//正常执行方法并返回return joinPoint.proceed();} catch (Throwable throwable) {redisTemplate.delete(redisKey);throw new Throwable(throwable);}} else {// 抛出异常throw new CustomException(请勿重复提交);}} } 自定义异常类和全局异常处理 自定义异常类CustomException package com.wzw.config.exception;/** 自定义异常/ public class CustomException extends Exception {public CustomException() {super();}public CustomException(String message) {super(message);} } 全局异常处理CustomExceptionHandler package com.wzw.config.exception;import com.wzw.base.pojo.Result; import com.wzw.config.exception.CustomException; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice;Slf4j RestControllerAdvice public class CustomExceptionHandler {/** 每当抛出CustomException异常就会进入这里* param e 自定义异常类* return 返回值实体/ExceptionHandler(value CustomException.class)ResponseBodypublic Result handleCustomException(CustomException e){Result resultResult.init();result.setMsg(e.getMessage());result.setCode(0);return result;}} 响应实体Result package com.wzw.base.pojo;import lombok.Data;/** 返回值响应实体/ Data public class Result {private int code;private String msg;private Object data;public static Result init(){return new Result();}public static Result ok(){Result resultResult.init();result.code1;return result;}public static Result ok(String msg){Result resultResult.ok();result.setMsg(msg);return result;}public static Result err(){Result resultResult.init();result.code0;return result;}public static Result err(String msg){Result resultResult.err();result.setMsg(msg);return result;} } Redis 设置Redis配置数据源然后创建 Redis配置类 package com.wzw.config.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;Configuration public class RedisConfig {Beanpublic RedisTemplateObject, Object redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplateObject, Object template new RedisTemplate();template.setConnectionFactory(connectionFactory);Jackson2JsonRedisSerializer serializer new Jackson2JsonRedisSerializer(Object.class);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;} } 使用 /** 防止重复提交测试* return 响应实体* throws CustomException 自定义异常类/RequestMapping(/testCustomerException)ResponseBodyRepeatSubmit(expireTime 10) //不加expireTime默认1s内加参数可以重新设定防止重复提交的时间public Result testCustomerException() throws CustomException {Result resultResult.ok(请求成功);return result;}可以看到第一次是请求成功之后五秒都是提示请勿重复提交
前端实现 来源https://blog.csdn.net/liangmengbk/article/details/127075604 /
防止重复点击 */ let clickTimer 0function clickThrottle() {var interval 3000;//3秒钟之内重复点击只算一次点击let now new Date(); // 获取当前时间的时间戳let timer clickTimer; // 记录触发事件的事件戳if (now - timer interval) {// 如果当前时间 - 触发事件时的事件 interVal那么不符合条件直接return false// 不让当前事件继续执行下去return false;} else {// 反之记录符合条件触发了事件的时间戳并 return true使事件继续往下执行clickTimer now;return true;} }在需要的地方进行调用 if(!clickThrottle()) return;