123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- package com.kmall.common.utils;
- import com.google.common.net.HttpHeaders;
- import org.apache.commons.lang3.StringUtils;
- import org.apache.commons.lang3.Validate;
- import org.apache.commons.lang3.exception.ExceptionUtils;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
- import javax.servlet.ServletRequest;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.UnsupportedEncodingException;
- import java.security.Principal;
- import java.util.*;
- import java.util.Map.Entry;
- /**
- * Http与Servlet工具类.
- *
- * @author calvin
- * @version 2014-8-19
- */
- public class ServletUtils {
- private static Log logger = LogFactory.getLog(ServletUtils.class);
- // -- 常用数值定义 --//
- public static final long ONE_YEAR_SECONDS = 60 * 60 * 24 * 365;
- // 静态文件后缀
- private final static String[] staticFiles = StringUtils.split(ResourceUtil.getConfigByName("/conf/servlet", "web.staticFile"), ",");
- /**
- * 设置客户端缓存过期时间 的Header.
- */
- public static void setExpiresHeader(HttpServletResponse response, long expiresSeconds) {
- // Http 1.0 header, set a fix expires date.
- response.setDateHeader(HttpHeaders.EXPIRES, System.currentTimeMillis() + expiresSeconds * 1000);
- // Http 1.1 header, set a time after now.
- response.setHeader(HttpHeaders.CACHE_CONTROL, "private, max-age=" + expiresSeconds);
- }
- /**
- * 设置禁止客户端缓存的Header.
- */
- public static void setNoCacheHeader(HttpServletResponse response) {
- // Http 1.0 header
- response.setDateHeader(HttpHeaders.EXPIRES, 1L);
- response.addHeader(HttpHeaders.PRAGMA, "no-cache");
- // Http 1.1 header
- response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, max-age=0");
- }
- /**
- * 设置LastModified Header.
- */
- public static void setLastModifiedHeader(HttpServletResponse response, long lastModifiedDate) {
- response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModifiedDate);
- }
- /**
- * 设置Etag Header.
- */
- public static void setEtag(HttpServletResponse response, String etag) {
- response.setHeader(HttpHeaders.ETAG, etag);
- }
- /**
- * 根据浏览器If-Modified-Since Header, 计算文件是否已被修改.
- * <p>
- * 如果无修改, checkIfModify返回false ,设置304 not modify status.
- *
- * @param lastModified 内容的最后修改时间.
- */
- public static boolean checkIfModifiedSince(HttpServletRequest request, HttpServletResponse response,
- long lastModified) {
- long ifModifiedSince = request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
- if ((ifModifiedSince != -1) && (lastModified < ifModifiedSince + 1000)) {
- response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
- return false;
- }
- return true;
- }
- /**
- * 根据浏览器 If-None-Match Header, 计算Etag是否已无效.
- * <p>
- * 如果Etag有效, checkIfNoneMatch返回false, 设置304 not modify status.
- *
- * @param etag 内容的ETag.
- */
- public static boolean checkIfNoneMatchEtag(HttpServletRequest request, HttpServletResponse response, String etag) {
- String headerValue = request.getHeader(HttpHeaders.IF_NONE_MATCH);
- if (headerValue != null) {
- boolean conditionSatisfied = false;
- if (!"*".equals(headerValue)) {
- StringTokenizer commaTokenizer = new StringTokenizer(headerValue, ",");
- while (!conditionSatisfied && commaTokenizer.hasMoreTokens()) {
- String currentToken = commaTokenizer.nextToken();
- if (currentToken.trim().equals(etag)) {
- conditionSatisfied = true;
- }
- }
- } else {
- conditionSatisfied = true;
- }
- if (conditionSatisfied) {
- response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
- response.setHeader(HttpHeaders.ETAG, etag);
- return false;
- }
- }
- return true;
- }
- /**
- * 设置让浏览器弹出下载对话框的Header.
- *
- * @param fileName 下载后的文件名.
- */
- public static void setFileDownloadHeader(HttpServletResponse response, String fileName) {
- try {
- // 中文文件名支持
- String encodedfileName = new String(fileName.getBytes(), "ISO8859-1");
- response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedfileName + "\"");
- } catch (UnsupportedEncodingException e) {
- e.getMessage();
- }
- }
- /**
- * 取得带相同前缀的Request Parameters, copy from spring WebUtils.
- * <p>
- * 返回的结果的Parameter名已去除前缀.
- */
- @SuppressWarnings("rawtypes")
- public static Map<String, Object> getParametersStartingWith(ServletRequest request, String prefix) {
- Validate.notNull(request, "Request must not be null");
- Enumeration paramNames = request.getParameterNames();
- Map<String, Object> params = new TreeMap<String, Object>();
- String pre = prefix;
- if (pre == null) {
- pre = "";
- }
- while (paramNames != null && paramNames.hasMoreElements()) {
- String paramName = (String) paramNames.nextElement();
- if ("".equals(pre) || paramName.startsWith(pre)) {
- String unprefixed = paramName.substring(pre.length());
- String[] values = request.getParameterValues(paramName);
- if (values == null || values.length == 0) {
- values = new String[]{};
- // Do nothing, no values found at all.
- } else if (values.length > 1) {
- params.put(unprefixed, values);
- } else {
- params.put(unprefixed, values[0]);
- }
- }
- }
- return params;
- }
- /**
- * 组合Parameters生成Query String的Parameter部分,并在paramter name上加上prefix.
- */
- public static String encodeParameterStringWithPrefix(Map<String, Object> params, String prefix) {
- StringBuilder queryStringBuilder = new StringBuilder();
- String pre = prefix;
- if (pre == null) {
- pre = "";
- }
- Iterator<Entry<String, Object>> it = params.entrySet().iterator();
- while (it.hasNext()) {
- Entry<String, Object> entry = it.next();
- queryStringBuilder.append(pre).append(entry.getKey()).append("=").append(entry.getValue());
- if (it.hasNext()) {
- queryStringBuilder.append("&");
- }
- }
- return queryStringBuilder.toString();
- }
- /**
- * 是否是Ajax异步请求
- *
- * @param request
- */
- public static boolean isAjaxRequest(HttpServletRequest request) {
- String accept = request.getHeader("accept");
- String xRequestedWith = request.getHeader("X-Requested-With");
- Principal principal = (Principal) ShiroUtils.getSubject().getPrincipal();
- // 如果是异步请求,则直接返回信息
- return ((accept != null && accept.indexOf("application/json") != -1
- || (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1)
- || (principal != null)));
- }
- /**
- * 获取当前请求对象
- *
- * @return
- */
- public static HttpServletRequest getRequest() {
- try {
- return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
- } catch (Exception e) {
- return null;
- }
- }
- /**
- * 判断访问URI是否是静态文件请求
- *
- * @throws Exception
- */
- public static boolean isStaticFile(String uri) {
- if (staticFiles == null) {
- try {
- throw new Exception("检测到“app.properties”中没有配置“web.staticFile”属性。配置示例:\n#静态文件后缀\n"
- + "web.staticFile=.css,.js,.png,.jpg,.gif,.jpeg,.bmp,.ico,.swf,.psd,.htc,.crx,.xpi,.exe,.ipa,.apk");
- } catch (Exception e) {
- logger.error(ExceptionUtils.getStackTrace(e));
- }
- }
- // if ((StringUtils.startsWith(uri, "/static/") || StringUtils.endsWithAny(uri, sfs))
- // && !StringUtils.endsWithAny(uri, ".jsp") && !StringUtils.endsWithAny(uri, ".java")){
- // return true;
- // }
- if (StringUtils.endsWithAny(uri, staticFiles)) {
- return true;
- }
- return false;
- }
- }
|