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}