工具类

来源:互联网 发布:freemind软件使用方法 编辑:程序博客网 时间:2024/05/17 04:09
/*
 * 文件名:  TSP
 * 版权:    Copyright 2000-2010 Huawei Tech. Co. Ltd. All Rights Reserved.
 * 创建人:  005932
 * 文件描述:  
 * 修改时间: 2009-9-10 下午08:04:15
 * 修改内容: 新增
 */
package com.huawei.src.util;


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;


import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;


import com.huawei.src.common.exception.SRCportalException;
import com.huawei.src.util.config.ConfigHelper;
import com.huawei.src.util.constant.SystemConstant;


/**
 * TSP 工具类
 * 
 * @author 005932
 * @version srcms V2R1C01B01
 */
public abstract class SRCportalUtils
{
    private static final Logger logger = Logger.getLogger(SRCportalUtils.class);    
    private static final char[] PARAM = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
            'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A',
            'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
            'W', 'X', 'Y', 'Z'};
            
    private final static Map<String, Pattern> REGMAP = new HashMap<String, Pattern>();
    
    static
    {
        REGMAP.put("*", Pattern.compile("\\*+"));
        REGMAP.put("?", Pattern.compile("\\?+"));
        REGMAP.put("+", Pattern.compile("\\++"));
    }
    
    /**
     * 判断字符串是否为空
     * 
     * @param str
     * @return
     */
    public static boolean isNull(String str)
    {
        return (null == str || "".equals(str.trim())) ? true : false;
    }
    
    /**
     * 
     * 方法表述 判断列表是否为空
     * @param list
     * @return boolean
     */
    public static boolean isListNull(List<?> list)
    {
        return (list == null || list.isEmpty());
    }
    
    /**
     * 
     * 方法表述 判断列表是否为空
     * @param list
     * @return boolean
     */
    public static boolean isMapNull(Map<?, ?> map)
    {
        return (map == null || map.isEmpty());
    }
    
    /**
     * 转义正则表达式的元字符 \ . $ ^ [ ] { } | + ?
     */
    public static Pattern transferReg(String reg)
    {
        Pattern pattern = null;
        String regString = reg;
        if (!Utils.isNull(reg))
        {
            for (Map.Entry<String, Pattern> mapEntry : REGMAP.entrySet())
            {
                if (regString.startsWith(mapEntry.getKey()))
                {
                    regString = "." + mapEntry.getKey() + regString.substring(1);
                    break;
                }
            }
            
            try
            {
                pattern = Pattern.compile(regString, Pattern.CASE_INSENSITIVE);
            }
            catch (Throwable e)
            {
                logger.error("Prepare to compile regex failed, pattern syntax error, reg string is " + reg
                        + ", message:" + e.getMessage());
            }
        }
        
        return pattern;
    }
    
    /**
     * 
     * 获取加密方式
     * 
     * @return String
     */
    public static String getEncryptType()
    {
        String type = ConfigHelper.getString(SystemConstant.SRCMS_ENCRYPTION_TYPE);
        
        if (!"MD5".equals(type.toLowerCase(Locale.US)) && !"SHA256".equals(type.toLowerCase(Locale.US)))
        {
            type = "MD5";
        }
        
        return type;
    }
    
    /**
     * 校验srcms和tds是否在同一个网段内
     * @param srcmsUrl srcms的内网地址
     * @param url 同步tds的地址
     * @return boolean false : 不在同一个网段内 true :在同一个网段内
     */
    public static boolean validateIp(String srcmsUrl, String url)
    {
        boolean flag = false;
        
        if (StringUtils.isNotBlank(srcmsUrl) && StringUtils.isNotBlank(url))
        {
            if (srcmsUrl.indexOf("localhost") != -1)
            {
                flag = true;
                return flag;
            }
            String srcmsUrlSub = srcmsUrl.substring(srcmsUrl.indexOf("//") + 2, srcmsUrl.indexOf("."));
            String urlSub = url.substring(url.indexOf("//") + 2, url.indexOf("."));
            if (srcmsUrlSub.equals(urlSub) || "10".equals(urlSub) || "172".equals(urlSub) || "192".equals(urlSub))
            {
                flag = true;
            }
        }
        
        return flag;
    }
    
    /**
     * 
     * 防止HTML、sql注入。
     * 
     * @param src
     * @return
     */
    public static String escapeSpecialString(String src)
    {
        if (!SRCportalUtils.isNull(src))
        {
            src = src.trim();
            
            // str含有HTML标签的文本
            src = src.replace("<", "&lt;");
            src = src.replace(">", "&gt;");
            //            src = src.replace("\n", "<br>");
            src = src.replace("\"", "&quot;");
            src = src.replace("\'", "&#039;");
            
            // sql
            src = StringEscapeUtils.escapeSql(src);
        }
        
        return src;
    }
    
    /**
     * 防止sql注入
     * 
     * @param src
     * @return
     */
    public static String escapeSqlString(String src)
    {
        src = src.trim();
        src = StringEscapeUtils.escapeSql(src);
        return src;
    }
    
    /**
     * 
     *  函数把一些预定义的字符转换为 HTML 实体。
     *   预定义的字符是:
     *    & (和号) 成为 &amp;
     *    " (双引号) 成为 &quot;
     *    ' (单引号) 成为 &#039;
     *    < (小于) 成为 &lt;
     *     > (大于) 成为 &gt;
     * 
     * @param src
     * @return
     */
    public static String escapeHtmlString(String src)
    {
        src = src.trim();
        src = StringEscapeUtils.escapeHtml(src);
        return src;
    }
    
    /**
     * 生成size位数的[0-9a-zA-Z]随机数
     * @param size
     * @return
     */
    public static String generateRand(int size)
    {
        SecureRandom ran = new SecureRandom();
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < size; i++)
        {
            char temp = PARAM[Math.abs((ran.nextInt()) % 62)];
            while (sb.indexOf(String.valueOf(temp)) != -1)
            {
                temp = PARAM[Math.abs((ran.nextInt()) % 62)];
            }
            sb.append(temp).append("");
        }
        return sb.toString();
    }
    
    /**
     * JSON非法字符处理
     * @author z00194399
     * 
     * filter sensitive data to prevent cross-site scripting
     */
    public static String xssfilterForJson(String value)
    {
        if (null == value)
        {
            return null;
        }
        StringBuffer result = new StringBuffer(value.length());
        
        for (int i = 0; i < value.length(); ++i)
        {
            switch (value.charAt(i))
            {
                case '<':
                    result.append("&lt;");
                    break;
                case '>':
                    result.append("&gt;");
                    break;
                case '\'':
                    result.append("&#39;");
                    break;
                case '%':
                    result.append("&#37;");
                    break;
                case ';':
                    result.append("&#59;");
                    break;
                case '(':
                    result.append("&#40;");
                    break;
                case ')':
                    result.append("&#41;");
                    break;
                case '&':
                    result.append("&amp;");
                    break;
                case '+':
                    result.append("&#43;");
                    break;
                default:
                    result.append(value.charAt(i));
                    break;
            }
        }
        
        return result.toString().replaceAll("\\\\\"", "&quot;");
    }
    /**
     * 跨站脚本非法字符处理
     * @author z00194399
     * 
     * filter sensitive data to prevent cross-site scripting
     */
    public static String xssfilter(String value)
    {
        if (null == value)
        {
            return null;
        }
        StringBuffer result = new StringBuffer(value.length());
        
        for (int i = 0; i < value.length(); ++i)
        {
            switch (value.charAt(i))
            {
            case '<':
                result.append("&lt;");
                break;
            case '>':
                result.append("&gt;");
                break;
            case '"':
                result.append("&quot;");
                break;
            case '\'':
                result.append("&#39;");
                break;
            case '%':
                result.append("&#37;");
                break;
            case ';':
                result.append("&#59;");
                break;
            case '(':
                result.append("&#40;");
                break;
            case ')':
                result.append("&#41;");
                break;
            case '&':
                result.append("&amp;");
                break;
            case '+':
                result.append("&#43;");
                break;
            default:
                result.append(value.charAt(i));
                break;
            }
        }
        
        return result.toString();
    }
    
    /**
     * 校验输入\输出字符合法性
     * @param inputStr
     * @return
     */
    public static String validateChar(String regStr, String inputStr)
    {
        String result = null;
        
        if (Utils.isNull(inputStr))
        {
            return inputStr;
        }
        if (isNull(regStr))
        {
            regStr = SystemConstant.DEFAULT_CHAR;
        }
        
        Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(inputStr);
        if (matcher.find())
        {
            result = matcher.group();
        }
        else
        {
            result = "invalid chars";
        }
        return result;
    }
    
    /**
     * 用UUID生成一个唯一token
     * @return
     */
    public static synchronized String generateToken()
    {
        UUID uuid = UUID.randomUUID();
        
        return uuid.toString();
    }
    
    /**
     * 判断是否存在非法csrf
     * @param request
     * @return
     */
    public static boolean validateCSRF(HttpServletRequest request)
    {
        boolean ret = false;
        String sToken = (String)request.getSession().getAttribute(SystemConstant.CSRFTOKEN);
        String rToken = request.getParameter("csrf_token");
        if (null != sToken && null != rToken && sToken.equals(rToken))
        {
            ret = true;
        }
        
        // token不管使用通过与否,被验证过都注销更新
        String csrfToken = "csrf-" + SRCportalUtils.generateToken();
        request.getSession().removeAttribute(SystemConstant.CSRFTOKEN);
        request.getSession().setAttribute(SystemConstant.CSRFTOKEN, csrfToken);
        
        return ret;
    }
    
    /**
     * 校验请求是否可能来自跨站referer
     * @param referer
     * @return
     */
    public static boolean identifyReferer(String referer)
    {
        String credit = ConfigHelper.getString("srcmsreferer");
        // 如果不配置,认为不校验referer,返回true
        if (isNull(credit))
        {
            return true;
        }
        
        String domain = getHost(referer);
        if (null == domain)
        {
            logger.error("Get host from referer failed.");
        }
        else
        {
            List<String> list = Arrays.asList(credit.split(";"));
            if (list.contains(domain))
            {
                return true;
            }
        }
        
        return false;
    }
    
    /**
     * 获取主机
     *
     * @param referrer
     * @return 
     *
     */
    private static String getHost(final String referer)
    {
        if (null == referer)
        {
            return null;
        }
        
        int position = referer.indexOf("://");
        if (position == -1)
        {
            return null;
        }
        
        int startPos = position + 3;
        
        int paramStartPos = referer.indexOf('?');
        String hostAndPath = (paramStartPos == -1 ? referer : referer.substring(0, paramStartPos));
        int endPos = hostAndPath.indexOf('/', startPos);
        String hostPart = (endPos == -1 ? hostAndPath.substring(startPos) : hostAndPath.substring(startPos, endPos));
        
        String host = null;
        int hostNameEndPos = hostPart.lastIndexOf(':');
        
        if (hostNameEndPos == -1)
        {
            host = hostPart;
        }
        else
        {
            host = hostPart.substring(0, hostNameEndPos);
        }
        
        return host;
    }
    
    /**
     * 加固密码复杂度,至少8个字符,英文、数字、其它字符各至少出现一次
     * @param pwd
     * @return
     */
    public static boolean checkPassword(String pwd)
    {
        if (pwd.length() < 8)
        {
            return false;
        }
        else
        {
            int passPower = 0;
            Pattern pattern1 = Pattern.compile("(?=.*[^0-9A-Za-z]).{8,}");
            Matcher m1 = pattern1.matcher(pwd);
            if (m1.matches())
                passPower++;
            Pattern pattern2 = Pattern.compile("(?=.*\\d).{8,}");
            Matcher m2 = pattern2.matcher(pwd);
            if (m2.matches())
                passPower++;
            Pattern pattern3 = Pattern.compile("(?=.*[A-Za-z]).{8,}");
            Matcher m3 = pattern3.matcher(pwd);
            if (m3.matches())
                passPower++;
                
            if (passPower < 3)
            {
                return false;
            }
        }
        return true;
    }
    
    /**
     * 生成唯一的ID
     * @param type reserved
     * @return ID
     */
    public static synchronized String getUUID(String type)
    {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        
        UUID uuid = UUID.randomUUID();
        
        StringBuffer sb = new StringBuffer();
        
        sb.append(type);
        sb.append(format.format(new Date()));
        
        String uid = uuid.toString().replace("-", "").substring(0, 6).toUpperCase(Locale.US);
        sb.append(uid);
        return sb.toString();
    }
    
    /**
     * 获取通用文件字节大小
     * 默认最大10M
     *
     * @return 
     *
     */
    public static long getCommonFileByteSize()
    {
        long maxsize = ConfigHelper.getLong("commons.multipart.maxSize", 10485760l);
        return maxsize;
    }
    
    /**
     * 判断上传的文件类型是否支持
     *
     * @param fileName
     * @param supportTypes
     * @return 
     *
     */
    public static boolean isUploadFileTypeSupport(String fileName, String[] supportTypes)
    {
        for (String fileType : supportTypes)
        {
            if (fileName.endsWith(fileType))
            {
                return true;
            }
        }
        
        return false;
    }


    /**
     * 获取请求的URI
     *
     * @param request
     * @return 
     *
     */
    public static String getRequestUri(HttpServletRequest request)
    {
        String uri = request.getServletPath();
        String pathInfo = request.getPathInfo();
        if (pathInfo != null)
        {
            uri = uri + pathInfo;
        }
        
        return uri;
    }


    
    /**
     * 获取请求IP地址
     *
     * @param req
     * @return 
     *
     */
    public static String getRequestIP(ServletRequest req)
    {
        HttpServletRequest request = null;
        if (req instanceof HttpServletRequest)
        {
            request = (HttpServletRequest)req;
        }
        
        if (null == request)
        {
        logger.error("HttpServletRequest is null.");
            return null;
        }
        
        String requestIP = request.getHeader("x-forwarded-for");
        if (requestIP == null || requestIP.length() == 0 || "unknown".equalsIgnoreCase(requestIP))
        {
            requestIP = request.getHeader("Proxy-Client-IP");
        }
        
        if (requestIP == null || requestIP.length() == 0 || "unknown".equalsIgnoreCase(requestIP))
        {
            requestIP = request.getHeader("WL-Proxy-Client-IP");
        }
        
        if (requestIP == null || requestIP.length() == 0 || "unknown".equalsIgnoreCase(requestIP))
        {
            requestIP = request.getRemoteAddr();
        }
        
        return requestIP;
    }
    
    /**
     * 获取请求body
     *
     * @param req
     * @return
     * @throws TQSException 
     *
     */
    public static String getRequestBody(ServletRequest req) throws SRCportalException
    {
        String requestBody = null;
        ByteArrayOutputStream ostream = null;
        
        try
        {
            // 获得消息体
            byte[] buffer = new byte[1024];
            
            InputStream istream = req.getInputStream();
            ostream = new ByteArrayOutputStream();
            
            int byteread = istream.read(buffer);
            while (byteread != -1)
            {
                ostream.write(buffer, 0, byteread);
                byteread = istream.read(buffer);
            }
            
            requestBody = new String(ostream.toString("UTF-8"));
        }
        catch (IOException e)
        {
            throw new SRCportalException("Read request stream data failed.", e);
        }
        finally
        {
            IOUtils.closeQuietly(ostream);
        }
        
        return requestBody;
    }
}
0 0
原创粉丝点击