001package run.iget.framework.common.util; 002 003import java.io.BufferedOutputStream; 004import java.io.IOException; 005import java.io.OutputStream; 006import java.io.PrintWriter; 007import java.net.URLEncoder; 008import java.util.Enumeration; 009import java.util.HashMap; 010import java.util.Map; 011 012import javax.servlet.ServletException; 013import javax.servlet.http.HttpServletRequest; 014import javax.servlet.http.HttpServletResponse; 015 016import org.springframework.http.HttpHeaders; 017import org.springframework.http.MediaType; 018import org.springframework.web.context.request.RequestAttributes; 019import org.springframework.web.context.request.RequestContextHolder; 020import org.springframework.web.context.request.ServletRequestAttributes; 021 022import com.alibaba.fastjson.JSON; 023 024import cn.hutool.core.util.CharsetUtil; 025import cn.hutool.core.util.StrUtil; 026import lombok.extern.slf4j.Slf4j; 027 028@Slf4j 029public class WebUtils { 030 031 public final static String IN_LINE = "inline"; 032 public final static String ATTACHMENT = "attachment"; 033 034 public static HttpServletRequest getHttpServletRequest() { 035 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); 036 if (requestAttributes == null) { 037 return null; 038 } 039 040 return ((ServletRequestAttributes) requestAttributes).getRequest(); 041 } 042 043 public static Map<String, String> getParameterMap(HttpServletRequest request) { 044 Enumeration<String> parameters = request.getParameterNames(); 045 046 Map<String, String> params = new HashMap<>(); 047 while (parameters.hasMoreElements()) { 048 String parameter = parameters.nextElement(); 049 String value = request.getParameter(parameter); 050 if (StrUtil.isNotBlank(value)) { 051 params.put(parameter, value); 052 } 053 } 054 055 return params; 056 } 057 058 public static String getDomain() { 059 HttpServletRequest request = getHttpServletRequest(); 060 StringBuffer url = request.getRequestURL(); 061 return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString(); 062 } 063 064 public static String getOrigin() { 065 HttpServletRequest request = getHttpServletRequest(); 066 return request.getHeader(HttpHeaders.ORIGIN); 067 } 068 069 /** 070 * 从header、url中查询参数值 071 * @param parameterName 参数名称 072 * @return 参数值 073 */ 074 public static String getParameter(String parameterName) { 075 HttpServletRequest request = getHttpServletRequest(); 076 String parameter = request.getHeader(parameterName); 077 if (StrUtil.isNotBlank(parameter)) { 078 return parameter; 079 } 080 081 parameter = request.getParameter(parameterName); 082 if (StrUtil.isNotBlank(parameter)) { 083 return parameter; 084 } 085 return null; 086 } 087 088 /** 089 * 下载文件 090 * 091 * @param response 092 * @param fileName 093 * @throws IOException 094 */ 095 public static void responseFile(HttpServletResponse response, byte[] data, String fileName) throws IOException { 096 responseFile(response, ATTACHMENT, MediaType.APPLICATION_OCTET_STREAM_VALUE, data, fileName, true); 097 } 098 099 /** 100 * 显示下载文件 101 * 102 * @param response 103 * @param fileName 104 * @throws IOException 105 */ 106 public static void responseFile(HttpServletResponse response, String contentType, byte[] data, String fileName) 107 throws IOException { 108 responseFile(response, IN_LINE, contentType, data, fileName, true); 109 } 110 111 /** 112 * 输出文件 113 * 114 * @param response 115 * @param fileName 116 * @throws IOException 117 */ 118 public static void responseFile(HttpServletResponse response, String downType, String contentType, byte[] data, 119 String fileName, boolean noCache) 120 throws IOException { 121 // 清空response 122 response.reset(); 123 // 设置响应头,控制浏览器下载该文件 124 response.setHeader("Content-Disposition", downType + ";filename=" + URLEncoder.encode(fileName, "UTF-8")); 125 response.addHeader("Content-Length", "" + data.length); 126 response.setContentType(contentType); 127 //禁止缓存 128 if (noCache) { 129 response.setHeader("Pragma", "No-cache"); 130 response.setHeader("Cache-Control", "No-cache"); 131 response.setDateHeader("Expires", 0); 132 } 133 //输出 134 try (OutputStream toClient = new BufferedOutputStream(response.getOutputStream())) { 135 toClient.write(data); 136 toClient.flush(); 137 } catch (IOException ex) { 138 throw ex; 139 } 140 } 141 142 /** 143 * 直接输出Json 144 * 145 * @param response 146 */ 147 public static void responseOut(HttpServletResponse response, String data) { 148 responseOut(response, data, MediaType.APPLICATION_JSON_VALUE); 149 } 150 151 /** 152 * 直接输出Html 153 * 154 * @param response 155 */ 156 public static void responseOutWithHtml(HttpServletResponse response, String data) { 157 responseOut(response, data, MediaType.TEXT_HTML_VALUE); 158 } 159 160 /** 161 * 直接输出Json 162 * 163 * @param response 164 */ 165 public static void responseOutWithJson(HttpServletResponse response, Object responseObject) { 166 responseOut(response, JSON.toJSONString(responseObject), MediaType.APPLICATION_JSON_VALUE); 167 } 168 169 /** 170 * 输出内容 171 * 172 * @param response 173 * @param data 174 * @param contentType 175 */ 176 public static void responseOut(HttpServletResponse response, String data, String contentType) { 177 responseOut(response, data, contentType, CharsetUtil.UTF_8); 178 } 179 180 /** 181 * 输出内容 182 * 183 * @param response 184 * @param data 185 * @param contentType 186 * @param charset 187 */ 188 public static void responseOut(HttpServletResponse response, String data, String contentType, String charset) { 189 response.setCharacterEncoding(charset); 190 response.setContentType(contentType); 191 PrintWriter out = null; 192 try { 193 out = response.getWriter(); 194 out.append(data); 195 } catch (IOException e) { 196 log.error("输出内容失败", e); 197 } finally { 198 if (out != null) { 199 out.close(); 200 } 201 } 202 203 } 204 205 /** 206 * 303-重定向 207 * 208 * @param response 209 * @param url 210 * @throws ServletException 211 * @throws IOException 212 */ 213 public static void sendRedirect(HttpServletResponse response, String url) throws ServletException, IOException { 214 response.setStatus(HttpServletResponse.SC_SEE_OTHER); 215 response.setHeader("Location", url); 216 } 217 218}