1 package com.gta.yyyf.commons.utils; 2 3 import java.io.UnsupportedEncodingException; 4 import java.net.URLDecoder; 5 import java.util.Enumeration; 6 import java.util.HashMap; 7 import java.util.Map; 8 import java.util.StringTokenizer; 9 10 import javax.servlet.http.HttpServletRequest; 11 12 import org.apache.commons.lang3.StringUtils; 13 import org.apache.commons.logging.Log; 14 import org.apache.commons.logging.LogFactory; 15 16 /** 17 * 18 * 功能描述:HttpServletRequest 工具类 19 * 20 * @author biyun.huang 21 * 22 *23 * 修改历史:(修改人,修改时间,修改原因/内容) 24 *
25 */ 26 public class RequestUtils { 27 28 private static final Log logger = LogFactory.getLog(RequestUtils.class); 29 public static final String POST = "POST"; 30 31 public static final String UTF8 = "UTF-8"; 32 public static final String GET = "GET"; 33 34 /** 35 * 获取QueryString的参数,并使用URLDecoder以UTF-8格式转码。如果请求是以post方法提交的, 36 * 那么将通过HttpServletRequest#getParameter获取。 37 * 38 * @param request 39 * web请求 40 * @param name 41 * 参数名称 42 * @return 43 */ 44 public static String getQueryParam(HttpServletRequest request, String name) { 45 if (StringUtils.isBlank(name)) { 46 return null; 47 } 48 if (request.getMethod().equalsIgnoreCase(POST)) { 49 return request.getParameter(name); 50 } 51 String s = request.getQueryString(); 52 if (StringUtils.isBlank(s)) { 53 return null; 54 } 55 try { 56 s = URLDecoder.decode(s, UTF8); 57 } catch (UnsupportedEncodingException e) { 58 logger.error("encoding " + UTF8 + " not support?", e); 59 } 60 String[] values = parseQueryString(s).get(name); 61 if (values != null && values.length > 0) { 62 return values[values.length - 1]; 63 } else { 64 return null; 65 } 66 } 67 68 public static MapgetQueryParams(HttpServletRequest request) { 69 Map map; 70 if (request.getMethod().equalsIgnoreCase(POST)) { 71 map = request.getParameterMap(); 72 } else { 73 String s = request.getQueryString(); 74 if (StringUtils.isBlank(s)) { 75 return new HashMap (); 76 } 77 try { 78 s = URLDecoder.decode(s, UTF8); 79 } catch (UnsupportedEncodingException e) { 80 logger.error("encoding " + UTF8 + " not support?", e); 81 } 82 map = parseQueryString(s); 83 } 84 85 Map params = new HashMap (map.size()); 86 int len; 87 for (Map.Entry entry : map.entrySet()) { 88 len = entry.getValue().length; 89 if (len == 1) { 90 params.put(entry.getKey(), entry.getValue()[0]); 91 } else if (len > 1) { 92 params.put(entry.getKey(), entry.getValue()); 93 } 94 } 95 return params; 96 } 97 98 /** 99 * 100 * Parses a query string passed from the client to the server and builds a101 * HashTable
object with key-value pairs. The query string102 * should be in the form of a string packaged by the GET or POST method,103 * that is, it should have key-value pairs in the form key=value,104 * with each pair separated from the next by a & character.105 * 106 *107 * A key can appear more than once in the query string with different108 * values. However, the key appears only once in the hashtable, with its109 * value being an array of strings containing the multiple values sent by110 * the query string.111 * 112 *
113 * The keys and values in the hashtable are stored in their decoded form, so114 * any + characters are converted to spaces, and characters sent in115 * hexadecimal notation (like %xx) are converted to ASCII characters.116 * 117 * @param s118 * a string containing the query to be parsed119 * 120 * @return a
HashTable
object built from the parsed key-value121 * pairs122 * 123 * @exception IllegalArgumentException124 * if the query string is invalid125 * 126 */127 public static MapparseQueryString(String s) {128 String valArray[] = null;129 if (s == null) {130 throw new IllegalArgumentException();131 }132 Map ht = new HashMap ();133 StringTokenizer st = new StringTokenizer(s, "&");134 while (st.hasMoreTokens()) {135 String pair = (String) st.nextToken();136 int pos = pair.indexOf('=');137 if (pos == -1) {138 continue;139 }140 String key = pair.substring(0, pos);141 String val = pair.substring(pos + 1, pair.length());142 if (ht.containsKey(key)) {143 String oldVals[] = (String[]) ht.get(key);144 valArray = new String[oldVals.length + 1];145 for (int i = 0; i < oldVals.length; i++) {146 valArray[i] = oldVals[i];147 }148 valArray[oldVals.length] = val;149 } else {150 valArray = new String[1];151 valArray[0] = val;152 }153 ht.put(key, valArray);154 }155 return ht;156 }157 158 public static Map getRequestMap(HttpServletRequest request,159 String prefix) {160 return getRequestMap(request, prefix, false);161 }162 163 public static Map getRequestMapWithPrefix(164 HttpServletRequest request, String prefix) {165 return getRequestMap(request, prefix, true);166 }167 168 private static Map getRequestMap(169 HttpServletRequest request, String prefix, boolean nameWithPrefix) {170 Map map = new HashMap ();171 Enumeration names = request.getParameterNames();172 String name, key, value;173 while (names.hasMoreElements()) {174 name = names.nextElement();175 if (name.startsWith(prefix)) {176 key = nameWithPrefix ? name : name.substring(prefix.length());177 value = StringUtils.join(request.getParameterValues(name), ',');178 map.put(key, value);179 }180 }181 return map;182 }183 184 /**185 * 获取访问者IP186 * 187 * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效�?188 * 189 * 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(�?分割)�?190 * 如果还不存在则调用Request .getRemoteAddr()�?191 * 192 * @param request193 * @return194 */195 public static String getIpAddr(HttpServletRequest request) {196 String ip = request.getHeader("X-Real-IP");197 if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {198 return ip;199 }200 ip = request.getHeader("X-Forwarded-For");201 if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {202 203 int index = ip.indexOf(',');204 if (index != -1) {205 return ip.substring(0, index);206 } else {207 return ip;208 }209 } else {210 return request.getRemoteAddr();211 }212 }213 214 @SuppressWarnings("unused")215 private static String cleanXSS(String value) {216 // You'll need to remove the spaces from the html entities below217 value = value.replaceAll("<", "<").replaceAll(">", ">");218 value = value.replaceAll("\\(", "(").replaceAll("\\)", ")");219 value = value.replaceAll("'", "'");220 value = value.replaceAll("\"", """);// by:wgc221 value = value.replaceAll("eval\\((.*)\\)", "");222 value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']",223 "\"\"");224 value = value.replaceAll("script", "");225 return value;226 }227 228 public static String[] getQueryParamValues(HttpServletRequest request,229 String name) {230 if (StringUtils.isBlank(name)) {231 return null;232 }233 if (request.getMethod().equalsIgnoreCase(POST)) {234 return request.getParameterValues(name);235 } else {236 return null;237 }238 }239 240 public static void main(String[] args) {241 try {242 System.out.println(URLDecoder.decode("%E6%B7%B1%E5%9C%B3", UTF8));243 } catch (UnsupportedEncodingException e) {244 logger.error(e);245 e.printStackTrace();246 }247 }248 }