| @@ -6,13 +6,12 @@ import com.fasterxml.jackson.databind.DeserializationFeature; | |||||
| import com.fasterxml.jackson.databind.ObjectMapper; | import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import com.fasterxml.jackson.databind.module.SimpleModule; | import com.fasterxml.jackson.databind.module.SimpleModule; | ||||
| import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; | ||||
| import com.iformall.interceptor.RequestInterceptor; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.http.converter.HttpMessageConverter; | import org.springframework.http.converter.HttpMessageConverter; | ||||
| import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | ||||
| import org.springframework.web.servlet.config.annotation.CorsRegistry; | |||||
| import org.springframework.web.servlet.config.annotation.EnableWebMvc; | |||||
| import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; | |||||
| import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | |||||
| import org.springframework.web.servlet.config.annotation.*; | |||||
| import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
| import java.math.BigInteger; | import java.math.BigInteger; | ||||
| @@ -22,6 +21,13 @@ import java.util.List; | |||||
| @Configuration | @Configuration | ||||
| @EnableWebMvc | @EnableWebMvc | ||||
| public class WebConfig implements WebMvcConfigurer { | public class WebConfig implements WebMvcConfigurer { | ||||
| @Autowired | |||||
| private RequestInterceptor requestInterceptor; | |||||
| @Override | |||||
| public void addInterceptors(InterceptorRegistry registry) { | |||||
| registry.addInterceptor(requestInterceptor).addPathPatterns("/api/**"); | |||||
| } | |||||
| @Override | @Override | ||||
| public void addResourceHandlers(ResourceHandlerRegistry registry) { | public void addResourceHandlers(ResourceHandlerRegistry registry) { | ||||
| @@ -0,0 +1,83 @@ | |||||
| package com.iformall.interceptor; | |||||
| import com.iformall.utils.HashUtil; | |||||
| import com.iformall.utils.IPUtil; | |||||
| import com.iformall.utils.Utility; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| import org.springframework.data.redis.core.RedisTemplate; | |||||
| import org.springframework.stereotype.Component; | |||||
| import org.springframework.web.servlet.ModelAndView; | |||||
| import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; | |||||
| import javax.annotation.Resource; | |||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.io.InputStream; | |||||
| import java.nio.charset.Charset; | |||||
| import java.util.Enumeration; | |||||
| import java.util.concurrent.TimeUnit; | |||||
| /** | |||||
| * 幂等检查 | |||||
| * @author stormeye.wu | |||||
| * @email wuguoqiang@iformall.com | |||||
| * @date 2017-03-23 15:38 | |||||
| */ | |||||
| @Component | |||||
| public class RequestInterceptor extends HandlerInterceptorAdapter { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
| @Resource | |||||
| private RedisTemplate<String, String> redisTemplate; | |||||
| @Override | |||||
| public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| sb.append("method=").append(request.getMethod()).append("&"); | |||||
| String ipaddress = IPUtil.getIpAddr(request); | |||||
| sb.append("ip=").append(ipaddress).append("&"); | |||||
| final Enumeration parameterNames = request.getParameterNames(); | |||||
| while (parameterNames.hasMoreElements()) { | |||||
| String key = (String) parameterNames.nextElement(); | |||||
| String parameter = request.getParameter(key); | |||||
| sb.append(key).append("=").append(parameter).append("&"); | |||||
| } | |||||
| InputStream inStream = request.getInputStream(); | |||||
| ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); | |||||
| byte[] buffer = new byte[1024]; | |||||
| int len = 0; | |||||
| while ((len = inStream.read(buffer)) != -1) { | |||||
| outSteam.write(buffer, 0, len); | |||||
| } | |||||
| String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); | |||||
| inStream.close(); | |||||
| outSteam.close(); | |||||
| sb.append(resultxml); | |||||
| String key = "request:" + HashUtil.md5(sb.toString()); | |||||
| if (redisTemplate.opsForValue().setIfAbsent(key, key)) { | |||||
| redisTemplate.expire(key, 3, TimeUnit.SECONDS); | |||||
| logger.info(key + ": 第一次提交"); | |||||
| return true; | |||||
| } | |||||
| logger.info(key + ": 第二次提交"); | |||||
| return false; | |||||
| } | |||||
| @Override | |||||
| public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { | |||||
| } | |||||
| @Override | |||||
| public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception { | |||||
| } | |||||
| } | |||||
| @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; | |||||
| import com.fasterxml.jackson.databind.module.SimpleModule; | import com.fasterxml.jackson.databind.module.SimpleModule; | ||||
| import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; | ||||
| import com.iformall.interceptor.AuthorizationInterceptor; | import com.iformall.interceptor.AuthorizationInterceptor; | ||||
| import com.iformall.interceptor.RequestInterceptor; | |||||
| import com.iformall.resolver.LoginUserHandlerMethodArgumentResolver; | import com.iformall.resolver.LoginUserHandlerMethodArgumentResolver; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||
| @@ -33,11 +34,14 @@ public class WebMvcConfig implements WebMvcConfigurer { | |||||
| @Autowired | @Autowired | ||||
| private AuthorizationInterceptor authorizationInterceptor; | private AuthorizationInterceptor authorizationInterceptor; | ||||
| @Autowired | @Autowired | ||||
| private RequestInterceptor requestInterceptor; | |||||
| @Autowired | |||||
| private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver; | private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver; | ||||
| @Override | @Override | ||||
| public void addInterceptors(InterceptorRegistry registry) { | public void addInterceptors(InterceptorRegistry registry) { | ||||
| registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**"); | registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**"); | ||||
| registry.addInterceptor(requestInterceptor).addPathPatterns("/api/**"); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -0,0 +1,82 @@ | |||||
| package com.iformall.interceptor; | |||||
| import com.iformall.utils.HashUtil; | |||||
| import com.iformall.utils.IPUtil; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| import org.springframework.data.redis.core.RedisTemplate; | |||||
| import org.springframework.stereotype.Component; | |||||
| import org.springframework.web.servlet.ModelAndView; | |||||
| import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; | |||||
| import javax.annotation.Resource; | |||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.io.InputStream; | |||||
| import java.nio.charset.Charset; | |||||
| import java.util.Enumeration; | |||||
| import java.util.concurrent.TimeUnit; | |||||
| /** | |||||
| * 幂等检查 | |||||
| * @author stormeye.wu | |||||
| * @email wuguoqiang@iformall.com | |||||
| * @date 2017-03-23 15:38 | |||||
| */ | |||||
| @Component | |||||
| public class RequestInterceptor extends HandlerInterceptorAdapter { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
| @Resource | |||||
| private RedisTemplate<String, String> redisTemplate; | |||||
| @Override | |||||
| public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| sb.append("method=").append(request.getMethod()).append("&"); | |||||
| String ipaddress = IPUtil.getIpAddr(request); | |||||
| sb.append("ip=").append(ipaddress).append("&"); | |||||
| final Enumeration parameterNames = request.getParameterNames(); | |||||
| while (parameterNames.hasMoreElements()) { | |||||
| String key = (String) parameterNames.nextElement(); | |||||
| String parameter = request.getParameter(key); | |||||
| sb.append(key).append("=").append(parameter).append("&"); | |||||
| } | |||||
| InputStream inStream = request.getInputStream(); | |||||
| ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); | |||||
| byte[] buffer = new byte[1024]; | |||||
| int len = 0; | |||||
| while ((len = inStream.read(buffer)) != -1) { | |||||
| outSteam.write(buffer, 0, len); | |||||
| } | |||||
| String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); | |||||
| inStream.close(); | |||||
| outSteam.close(); | |||||
| sb.append(resultxml); | |||||
| String key = "request:" + HashUtil.md5(sb.toString()); | |||||
| if (redisTemplate.opsForValue().setIfAbsent(key, key)) { | |||||
| redisTemplate.expire(key, 3, TimeUnit.SECONDS); | |||||
| logger.info(key + ": 第一次提交"); | |||||
| return true; | |||||
| } | |||||
| logger.info(key + ": 第二次提交"); | |||||
| return false; | |||||
| } | |||||
| @Override | |||||
| public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { | |||||
| } | |||||
| @Override | |||||
| public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { | |||||
| } | |||||
| } | |||||
| @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; | |||||
| import com.fasterxml.jackson.databind.module.SimpleModule; | import com.fasterxml.jackson.databind.module.SimpleModule; | ||||
| import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; | ||||
| import com.iformall.interceptor.AuthorizationInterceptor; | import com.iformall.interceptor.AuthorizationInterceptor; | ||||
| import com.iformall.interceptor.RequestInterceptor; | |||||
| import com.iformall.resolver.LoginUserHandlerMethodArgumentResolver; | import com.iformall.resolver.LoginUserHandlerMethodArgumentResolver; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||
| @@ -33,11 +34,14 @@ public class WebMvcConfig implements WebMvcConfigurer { | |||||
| @Autowired | @Autowired | ||||
| private AuthorizationInterceptor authorizationInterceptor; | private AuthorizationInterceptor authorizationInterceptor; | ||||
| @Autowired | @Autowired | ||||
| private RequestInterceptor requestInterceptor; | |||||
| @Autowired | |||||
| private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver; | private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver; | ||||
| @Override | @Override | ||||
| public void addInterceptors(InterceptorRegistry registry) { | public void addInterceptors(InterceptorRegistry registry) { | ||||
| registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**"); | registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**"); | ||||
| registry.addInterceptor(requestInterceptor).addPathPatterns("/api/**"); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -0,0 +1,82 @@ | |||||
| package com.iformall.interceptor; | |||||
| import com.iformall.utils.HashUtil; | |||||
| import com.iformall.utils.IPUtil; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| import org.springframework.data.redis.core.RedisTemplate; | |||||
| import org.springframework.stereotype.Component; | |||||
| import org.springframework.web.servlet.ModelAndView; | |||||
| import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; | |||||
| import javax.annotation.Resource; | |||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.io.InputStream; | |||||
| import java.nio.charset.Charset; | |||||
| import java.util.Enumeration; | |||||
| import java.util.concurrent.TimeUnit; | |||||
| /** | |||||
| * 幂等检查 | |||||
| * @author stormeye.wu | |||||
| * @email wuguoqiang@iformall.com | |||||
| * @date 2017-03-23 15:38 | |||||
| */ | |||||
| @Component | |||||
| public class RequestInterceptor extends HandlerInterceptorAdapter { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
| @Resource | |||||
| private RedisTemplate<String, String> redisTemplate; | |||||
| @Override | |||||
| public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| sb.append("method=").append(request.getMethod()).append("&"); | |||||
| String ipaddress = IPUtil.getIpAddr(request); | |||||
| sb.append("ip=").append(ipaddress).append("&"); | |||||
| final Enumeration parameterNames = request.getParameterNames(); | |||||
| while (parameterNames.hasMoreElements()) { | |||||
| String key = (String) parameterNames.nextElement(); | |||||
| String parameter = request.getParameter(key); | |||||
| sb.append(key).append("=").append(parameter).append("&"); | |||||
| } | |||||
| InputStream inStream = request.getInputStream(); | |||||
| ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); | |||||
| byte[] buffer = new byte[1024]; | |||||
| int len = 0; | |||||
| while ((len = inStream.read(buffer)) != -1) { | |||||
| outSteam.write(buffer, 0, len); | |||||
| } | |||||
| String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); | |||||
| inStream.close(); | |||||
| outSteam.close(); | |||||
| sb.append(resultxml); | |||||
| String key = "request:" + HashUtil.md5(sb.toString()); | |||||
| if (redisTemplate.opsForValue().setIfAbsent(key, key)) { | |||||
| redisTemplate.expire(key, 3, TimeUnit.SECONDS); | |||||
| logger.info(key + ": 第一次提交"); | |||||
| return true; | |||||
| } | |||||
| logger.info(key + ": 第二次提交"); | |||||
| return false; | |||||
| } | |||||
| @Override | |||||
| public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { | |||||
| } | |||||
| @Override | |||||
| public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { | |||||
| } | |||||
| } | |||||