/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.core.web.wrapper; import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import com.jinhe.tss.core.web.RewriteableHttpServletRequest; /** * <p> * RewriteableRequestWrapper.java * 代理请求对象(可自定义或修改请求参数) * </p> * */ public class RewriteableHttpServletRequestWrapper extends HttpServletRequestWrapper implements RewriteableHttpServletRequest { private Map<String, String[]> params = new HashMap<String, String[]>(); private Map<String, String[]> headers = new HashMap<String, String[]>(); private Map<String, Cookie> cookies = new HashMap<String, Cookie>(); private String servletPath = null; /** * <p> * 获取可复写属性和参数等增强功能的Request对象 * </p> * @param request * @return */ public static RewriteableHttpServletRequest getRewriteableHttpServletRequest(HttpServletRequest request) { if (request instanceof RewriteableHttpServletRequest) { return (RewriteableHttpServletRequest) request; } return new RewriteableHttpServletRequestWrapper(request); } private RewriteableHttpServletRequestWrapper(HttpServletRequest request) { super(request); } public void addParameter(String name, String value) { Object oldValue = params.get(name); String[] newValues; if (oldValue == null) { newValues = new String[] { value }; } else if (oldValue instanceof String[]) { List<String> oldValues = Arrays.asList((String[]) oldValue); newValues = oldValues.toArray(new String[oldValues.size() + 1]); newValues[oldValues.size()] = value; // 将新value add到数组最后 } else { newValues = new String[] { (String) oldValue, value }; } params.put(name, newValues); } @SuppressWarnings("unchecked") public Map<String, String[]> getParameterMap() { Map<String, String[]> map = new HashMap<String, String[]>(); map.putAll(super.getParameterMap()); map.putAll(params); return map; } public Enumeration<String> getParameterNames() { return new Enumerator(getParameterMap().keySet()); } // 取指定名字参数的值(多值) public String[] getParameterValues(String name) { return (String[])getParameterMap().get(name); } // 取指定名字参数的值(单值) public String getParameter(String name) { String[] values = (String[]) params.get(name); if (values != null && values.length > 0) { return values[0]; } return super.getParameter(name); } public String getHeader(String name) { String[] value = (String[]) headers.get(name); if (value != null && value.length > 0) { return value[0]; } return super.getHeader(name); } @SuppressWarnings("unchecked") public Enumeration<String> getHeaderNames() { Set<String> set = new HashSet<String>(); Enumeration<String> e = super.getHeaderNames(); while (e.hasMoreElements()) { set.add(e.nextElement()); } set.addAll(headers.keySet()); return new Enumerator(set); } @SuppressWarnings("unchecked") public Enumeration<String> getHeaders(String name) { Enumeration<String> e = super.getHeaders(name); Set<String> set = new HashSet<String>(); String[] value = (String[]) headers.get(name); if (value != null && value.length > 0) { for (int i = 0; i < value.length; i++) { set.add(value[i]); } } else { while (e.hasMoreElements()) { set.add(e.nextElement()); } } return new Enumerator(set); } public void setHeader(String name, String value) { headers.put(name, new String[] { value }); } public void setServletPath(String servletPath) { this.servletPath = servletPath; } public String getServletPath() { if (this.servletPath != null) { return this.servletPath; } return super.getServletPath(); } /** * <p> * 获取Cookie。 * cookie如果重名,优先取父目录下的cookie,遍历superCookies时候需要从后往前遍历, * 因为父目录下cookie相比子目录的同名cookie,在数组的靠前位置。 * </p> * @return * @see javax.servlet.http.HttpServletRequestWrapper#getCookies() */ public Cookie[] getCookies() { Cookie[] superCookies = super.getCookies(); Map<String, Cookie> cookiesMap = new HashMap<String, Cookie>(); if (superCookies != null) { for (int i = superCookies.length - 1; i >= 0; i--) { Cookie cookie = superCookies[i]; cookiesMap.put(cookie.getName(), cookie); } } cookiesMap.putAll(cookies); if (cookiesMap.isEmpty()) return null; Cookie[] allCookiesArray = new Cookie[cookiesMap.size()]; int i = 0; for (Entry<String, Cookie> entry : cookiesMap.entrySet()) { allCookiesArray[i++] = entry.getValue(); } return allCookiesArray; } /** * <p> 设置cookie </p> * * @param cookie */ public void addCookie(Cookie cookie) { cookies.put(cookie.getName(), cookie); } private static class Enumerator implements Enumeration<String> { private Iterator<String> iter = null; public Enumerator(Set<String> set) { iter = set.iterator(); } public boolean hasMoreElements() { return iter.hasNext(); } public String nextElement() { return iter.next(); } } }