RequestUtils.java
package com.web; import static com.jetcms.common.web.Constants.POST; import static com.jetcms.common.web.Constants.UTF8; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.util.UrlPathHelper; /** * HttpServletRequest帮助类 */ public class RequestUtils { private static final Logger log = LoggerFactory .getLogger(RequestUtils.class); /** * 获取QueryString的参数,并使用URLDecoder以UTF-8格式转码。如果请求是以post方法提交的, * 那么将通过HttpServletRequest#getParameter获取。 * * @param request * web请求 * @param name * 参数名称 * @return */ public static String getQueryParam(HttpServletRequest request, String name) { if (StringUtils.isBlank(name)) { return null; } if (request.getMethod().equalsIgnoreCase(POST)) { return request.getParameter(name); } String s = request.getQueryString(); if (StringUtils.isBlank(s)) { return null; } try { s = URLDecoder.decode(s, UTF8); } catch (UnsupportedEncodingException e) { log.error("encoding " + UTF8 + " not support?", e); } String[] values = parseQueryString(s).get(name); if (values != null && values.length > 0) { return values[values.length - 1]; } else { return null; } } @SuppressWarnings("unchecked") public static Map<String, Object> getQueryParams(HttpServletRequest request) { Map<String, String[]> map; if (request.getMethod().equalsIgnoreCase(POST)) { map = request.getParameterMap(); } else { String s = request.getQueryString(); if (StringUtils.isBlank(s)) { return new HashMap<String, Object>(); } try { s = URLDecoder.decode(s, UTF8); } catch (UnsupportedEncodingException e) { log.error("encoding " + UTF8 + " not support?", e); } map = parseQueryString(s); } Map<String, Object> params = new HashMap<String, Object>(map.size()); int len; for (Map.Entry<String, String[]> entry : map.entrySet()) { len = entry.getValue().length; if (len == 1) { params.put(entry.getKey(), entry.getValue()[0]); } else if (len > 1) { params.put(entry.getKey(), entry.getValue()); } } return params; } /** * * Parses a query string passed from the client to the server and builds a * <code>HashTable</code> object with key-value pairs. The query string * should be in the form of a string packaged by the GET or POST method, * that is, it should have key-value pairs in the form <i>key=value</i>, * with each pair separated from the next by a & character. * * <p> * A key can appear more than once in the query string with different * values. However, the key appears only once in the hashtable, with its * value being an array of strings containing the multiple values sent by * the query string. * * <p> * The keys and values in the hashtable are stored in their decoded form, so * any + characters are converted to spaces, and characters sent in * hexadecimal notation (like <i>%xx</i>) are converted to ASCII characters. * * @param s * a string containing the query to be parsed * * @return a <code>HashTable</code> object built from the parsed key-value * pairs * * @exception IllegalArgumentException * if the query string is invalid * */ public static Map<String, String[]> parseQueryString(String s) { String valArray[] = null; if (s == null) { throw new IllegalArgumentException(); } Map<String, String[]> ht = new HashMap<String, String[]>(); StringTokenizer st = new StringTokenizer(s, "&"); while (st.hasMoreTokens()) { String pair = (String) st.nextToken(); int pos = pair.indexOf('='); if (pos == -1) { continue; } String key = pair.substring(0, pos); String val = pair.substring(pos + 1, pair.length()); if (ht.containsKey(key)) { String oldVals[] = (String[]) ht.get(key); valArray = new String[oldVals.length + 1]; for (int i = 0; i < oldVals.length; i++) { valArray[i] = oldVals[i]; } valArray[oldVals.length] = val; } else { valArray = new String[1]; valArray[0] = val; } ht.put(key, valArray); } return ht; } public static Map<String, String> getRequestMap(HttpServletRequest request, String prefix) { return getRequestMap(request, prefix, false); } public static Map<String, String> getRequestMapWithPrefix( HttpServletRequest request, String prefix) { return getRequestMap(request, prefix, true); } @SuppressWarnings("unchecked") private static Map<String, String> getRequestMap( HttpServletRequest request, String prefix, boolean nameWithPrefix) { Map<String, String> map = new HashMap<String, String>(); Enumeration<String> names = request.getParameterNames(); String name, key, value; while (names.hasMoreElements()) { name = names.nextElement(); if (name.startsWith(prefix)) { key = nameWithPrefix ? name : name.substring(prefix.length()); value = StringUtils.join(request.getParameterValues(name), ','); map.put(key, value); } } return map; } /** * 获取访问者IP * * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。 * * 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割), * 如果还不存在则调用Request .getRemoteAddr()。 * * @param request * @return */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Real-IP"); if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { if(ip.contains("../")||ip.contains("..\\")){ return ""; } return ip; } ip = request.getHeader("X-Forwarded-For"); if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { // 多次反向代理后会有多个IP值,第一个为真实IP。 int index = ip.indexOf(','); if (index != -1) { ip= ip.substring(0, index); } if(ip.contains("../")||ip.contains("..\\")){ return ""; } return ip; } else { ip=request.getRemoteAddr(); if(ip.contains("../")||ip.contains("..\\")){ return ""; } if(ip.equals("0:0:0:0:0:0:0:1")){ ip="127.0.0.1"; } return ip; } } /** * 获得当的访问路径 * * HttpServletRequest.getRequestURL+"?"+HttpServletRequest.getQueryString * * @param request * @return */ public static String getLocation(HttpServletRequest request) { UrlPathHelper helper = new UrlPathHelper(); StringBuffer buff = request.getRequestURL(); String uri = request.getRequestURI(); String origUri = helper.getOriginatingRequestUri(request); buff.replace(buff.length() - uri.length(), buff.length(), origUri); String queryString = helper.getOriginatingQueryString(request); if (queryString != null) { buff.append("?").append(queryString); } return buff.toString(); } /** * 获得请求的session id,但是HttpServletRequest#getRequestedSessionId()方法有一些问题。 * 当存在部署路径的时候,会获取到根路径下的jsessionid。 * * @see HttpServletRequest#getRequestedSessionId() * * @param request * @return */ public static String getRequestedSessionId(HttpServletRequest request) { String sid = request.getRequestedSessionId(); String ctx = request.getContextPath(); // 如果session id是从url中获取,或者部署路径为空,那么是在正确的。 if (request.isRequestedSessionIdFromURL() || StringUtils.isBlank(ctx)) { return sid; } else { // 手动从cookie获取 Cookie cookie = CookieUtils.getCookie(request,Constants.JSESSION_COOKIE); if (cookie != null) { return cookie.getValue(); } else { return request.getSession().getId(); } } } public static Map<String,String> getSignMap(HttpServletRequest request){ Map<String,String>param=new HashMap<String, String>(); Enumeration penum=(Enumeration) request.getParameterNames(); while(penum.hasMoreElements()){ String pKey=(String) penum.nextElement(); String value=request.getParameter(pKey); //sign和uploadFile不参与 值为空也不参与 if(!pKey.equals("sign")&&!pKey.equals("uploadFile") &&StringUtils.isNotBlank(value)){ param.put(pKey,value); } } return param; } public static void main(String[] args) { } }
ResponseUtils.java
package com.web; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jetcms.cms.api.ApiResponse; /** * HttpServletResponse帮助类 */ public final class ResponseUtils { public static final Logger log = LoggerFactory .getLogger(ResponseUtils.class); /** * 发送文本。使用UTF-8编码。 * * @param response * HttpServletResponse * @param text * 发送的字符串 */ public static void renderText(HttpServletResponse response, String text) { render(response, "text/plain;charset=UTF-8", text); } /** * 发送json。使用UTF-8编码。 * * @param response * HttpServletResponse * @param text * 发送的字符串 */ public static void renderJson(HttpServletResponse response, String text) { render(response, "application/json;charset=UTF-8", text); } /** * 发送xml。使用UTF-8编码。 * * @param response * HttpServletResponse * @param text * 发送的字符串 */ public static void renderXml(HttpServletResponse response, String text) { render(response, "text/xml;charset=UTF-8", text); } /** * 发送内容。使用UTF-8编码。 * * @param response * @param contentType * @param text */ public static void render(HttpServletResponse response, String contentType, String text) { response.setContentType(contentType); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); try { response.getWriter().write(text); } catch (IOException e) { log.error(e.getMessage(), e); } } public static void renderApiJson(HttpServletResponse response, HttpServletRequest request,ApiResponse apiResult) { //js跨域请求 String callback = request.getParameter("callback"); if(StringUtils.isNotBlank(callback)){ ResponseUtils.renderJson(response,callback+"(" + apiResult.toString() + ")" ); }else{ ResponseUtils.renderJson(response, apiResult.toString()); } } }