GetRequestInfo.java
/** * web-parent * Created by hfj * on 2017/7/7. */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface GetRequestInfo { }
WebUtils.java
package com.j2eecms.web.util; import com.google.common.base.Strings; import com.j2eecms.core.model.RequestInfo; import com.j2eecms.web.exception.CaptchaException; import com.j2eecms.web.exception.CaptchaTimeOutException; import eu.bitwalker.useragentutils.UserAgent; import org.springframework.http.HttpHeaders; import org.springframework.mobile.device.Device; import org.springframework.mobile.device.DeviceType; import org.springframework.mobile.device.DeviceUtils; import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.regex.Pattern; /** * Created by hfj on 2016/2/6. */ public class WebUtils { public static final String UNKNOWN = "UNKNOWN"; private final static String REGEX = "[@?`~!#$%^&*()+=|{}':;',//[//]<>/?~!#¥%……&*()——+|{}【】‘;:”“’。,、?]"; private final static Pattern STRING_PATTERN = Pattern.compile(REGEX); /** * 验证码默认超时时间 * 10分钟 */ public final static long CAPTCHA_TIMEOUT = 600000; private WebUtils() { } public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } else { int index = ip.lastIndexOf(","); if (index != -1) { ip = ip.substring(index + 1); } } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } /** * 获取RequestInfo * * @param request * @return */ public static RequestInfo getRequestInfo(HttpServletRequest request) { RequestInfo requestInfo = new RequestInfo(); String curIp = getIpAddr(request); Device device = DeviceUtils.getCurrentDevice(request); if (null == device) { requestInfo.setDeviceType(UNKNOWN); } else if (device.isMobile()) { requestInfo.setDeviceType(DeviceType.MOBILE.toString()); } else if (device.isNormal()) { requestInfo.setDeviceType(DeviceType.NORMAL.toString()); } else if (device.isTablet()) { requestInfo.setDeviceType(DeviceType.TABLET.toString()); } else { requestInfo.setDeviceType(UNKNOWN); } if (!Strings.isNullOrEmpty(curIp)) { requestInfo.setRequestIp(curIp.trim()); } String serverName = request.getServerName(); String domainName; if (null!=serverName && serverName.split("\\.").length > 2) { domainName = serverName.replaceAll("^.*?\\.", ""); } else { domainName = serverName; } requestInfo.setDomainName(domainName); requestInfo.setWebsite(request.getScheme() + "://" + request.getServerName()); String userAgent = request.getHeader(HttpHeaders.USER_AGENT); if (!Strings.isNullOrEmpty(userAgent)) { UserAgent useragent = UserAgent.parseUserAgentString(userAgent); String browser = useragent.getBrowser().getName(); String operatingSystem = useragent.getOperatingSystem().getName(); requestInfo.setBrowser(browser); requestInfo.setOperatingSystem(operatingSystem); } return requestInfo; } /** * 验证码校验 * 默认验证码超时时间 5 分钟 * * @param captcha 验证码 * @param exitCodeObject session中保存的验证码 * @param captchaTimeObject 验证码记录的时间 * @throws CaptchaException 验证码为空 * @throws CaptchaTimeOutException 验证码超时 * @throws CaptchaException 验证码错误 */ public static void verifyCaptcha(String captcha, Object exitCodeObject, Object captchaTimeObject) { verifyCaptcha(captcha, exitCodeObject, captchaTimeObject, CAPTCHA_TIMEOUT); } /** * 验证码校验 * 默认验证码超时时间 5 分钟 * * @param captcha 验证码 * @param exitCodeObject session中保存的验证码 * @param captchaTimeObject 验证码记录的时间 * @param timeOut 验证码超时时间 毫秒 * @throws CaptchaException 验证码为空 * @throws CaptchaTimeOutException 验证码超时 * @throws CaptchaException 验证码错误 */ private static void verifyCaptcha(String captcha, Object exitCodeObject, Object captchaTimeObject, long timeOut) { if (null == exitCodeObject || null == captchaTimeObject) { throw new CaptchaException("Captcha is null"); } String exitCode = (String) exitCodeObject; long captchaTime = (Long) captchaTimeObject; if (new Date().getTime() - captchaTime > timeOut) { throw new CaptchaTimeOutException("captcha timeout"); } if (!exitCode.equalsIgnoreCase(captcha)) { throw new CaptchaException("captcha exitCode error"); } } /** * 验证码校验超时 * 默认验证码超时时间 5 分钟 * * @param exitCodeObject session中保存的验证码 * @param captchaTimeObject 验证码记录的时间 * @param timeOut 验证码超时时间 毫秒 * @throws CaptchaException 验证码为空 * @throws CaptchaTimeOutException 验证码超时 * @throws CaptchaException 验证码错误 */ public static void verifyCaptchaTime(Object exitCodeObject, Object captchaTimeObject, long timeOut) { if (null == exitCodeObject || null == captchaTimeObject) { throw new CaptchaException("Captcha is null"); } long captchaTime = (Long) captchaTimeObject; if (new Date().getTime() - captchaTime > timeOut) { throw new CaptchaTimeOutException("captcha timeout"); } } /** * 特殊字符转换为" "后,移除首位空格 * * @param str 原字符串 * @return */ public static String stringFilter(String str) { if (Strings.isNullOrEmpty(str)) { return str; } return STRING_PATTERN.matcher(str).replaceAll(" ").trim(); } }
RequestInfoArgumentResolver .java
package com.j2eecms.web.resolver; import com.j2eecms.web.annotation.GetRequestInfo; import com.j2eecms.web.util.WebUtils; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import javax.servlet.http.HttpServletRequest; /** * web-parent * Created by hfj * on 2017/7/7. */ public class RequestInfoArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(GetRequestInfo.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = ((ServletWebRequest) webRequest).getRequest(); return WebUtils.getRequestInfo(request); } }
springmvc配置
<mvc:annotation-driven> <mvc:argument-resolvers> <bean class="com.j2eecms.web.converter.RequestInfoArgumentResolver"/> </mvc:argument-resolvers> </mvc:annotation-driven>
spring boot配置
@Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(new RequestInfoArgumentResolver()); }
上班劳累,注意休息,同时也给码友们推荐一下休闲方式,安全正规的公司,大家放心
相关推荐
springmvc各种参数绑定源码实现
在进行web项目的开发时,如果时间让用户自己输入,该怎么处理,SpringMVC的转换器可以处理,但是需要自己定义,如何定义和搭配呢?
主要介绍了SpringMVC自定义类型转换器实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
SpringMVC数据类型转换超详细介绍,注解式控制器的数据验证、类型转换及格式化
此例子对应了springmvc json格式转换的小例子,其中前端请求后端的json,利用springmvc api完成的
用来解决SpringMVC+Ajax技术中前台报406的错误信息,实现后台json格式与前台一致
springmvc自定义属性编辑器和参数解析器
Springmvc请求处理方法参数Springmvc请求处理方法参数
springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证 参数传递
本demo 用来写了springmvc如何接受ajax传集合以及接收form表单传集合
本文详细解析了springmvc接收参数的各种情况,适合项目实践开发调试。
springmvc中json转换的jar,包含jackson-core-asl.jar和Jackson-mapper-asl.jar
Spring MVC学习(七)-------SpringMVC数据类型转换
简介请求和响应都有对应的body,这个body就是需要关注的主要数据。请求体与请求的查询参数或者表单参数是不同的,请求体的表述般就是段字符串,查询参数可以看作u
主要介绍了Springmvc自定义类型转换器实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Springmvc自定义参数转换实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本篇文章主要介绍了SpringMVC实现自定义类型转换器 ,详细的介绍了自定义类型转换器的用法和好处,有兴趣的可以了解一下。
SpringMVC后台接收请求参数的几种方式源码。总结了常用的注解,介绍GET和POST请求方式下的参数传递方法。
springMVC3学习(八)--全局的异常处理(源码) 文章地址:http://blog.csdn.net/itmyhome1990/article/details/26286435
springmvc入门参数绑定,ssm整合。新手来学springmvc时候特别好用。我老师发的。