2019独角兽企业重金招聘Python工程师标准>>>
001
|
packagecom.cucpay.tradeportal.util;
|
003
|
importjava.io.UnsupportedEncodingException;
|
004
|
importjava.lang.reflect.Field;
|
005
|
importjava.net.URLDecoder;
|
006
|
importjava.net.URLEncoder;
|
007
|
importjava.nio.charset.CharacterCodingException;
|
008
|
importjava.nio.charset.Charset;
|
009
|
importjava.security.MessageDigest;
|
010
|
importjava.security.NoSuchAlgorithmException;
|
011
|
importjava.text.SimpleDateFormat;
|
012
|
importjava.util.ArrayList;
|
013
|
importjava.util.Arrays;
|
014
|
importjava.util.Calendar;
|
015
|
importjava.util.Collections;
|
016
|
importjava.util.Date;
|
017
|
importjava.util.List;
|
019
|
importjava.util.UUID;
|
021
|
importorg.apache.commons.lang.StringUtils;
|
022
|
importorg.apache.mina.core.buffer.IoBuffer;
|
026
|
* @create Aug 15, 2012 12:16:49 PM
|
027
|
* @update Sep 27, 2012 3:07:09 PM
|
028
|
* @author 玄玉<http://blog.csdn/net/jadyer>
|
030
|
* @history v1.7.2-->新增<code>getHexSign()</code>通过指定算法签名字符串方法
|
031
|
* @history v1.7.2-->新增<code>getString()</code>字节数组转为字符串方法
|
032
|
* @history v1.7.3-->修改<code>getSysJournalNo()</code>实现细节为<code>java.util.UUID.randomUUID()</code>
|
033
|
* @history v1.7.4-->新增<code>getHexSign()</code>根据指定的签名密钥和算法签名Map<String,String>
|
034
|
* @history v1.7.5-->新增<code>getStringSimple()</code>获取一个字符串的简明效果,返回的字符串格式类似于"abcd***hijk"
|
035
|
* @history v2.0-->局部的StringBuffer一律StringBuilder之(本思路提示自坦克<captmjc@gmail.com>)
|
037
|
publicclassTradePortalUtil {
|
038
|
privateTradePortalUtil(){}
|
042
|
* @see 若欲指定返回值的长度or是否全由数字组成等,you can call {@link TradePortalUtil#getSysJournalNo(int, boolean)}
|
045
|
publicstaticString getSysJournalNo(){
|
046
|
returngetSysJournalNo(20,true);
|
052
|
* @param length 指定流水号长度
|
053
|
* @param toNumber 指定流水号是否全由数字组成
|
055
|
publicstaticString getSysJournalNo(intlength,booleanisNumber){
|
056
|
//replaceAll()之后返回的是一个由十六进制形式组成的且长度为32的字符串
|
057
|
String uuid = UUID.randomUUID().toString().replaceAll("-","");
|
058
|
if(uuid.length() > length){
|
059
|
uuid = uuid.substring(0, length);
|
060
|
}elseif(uuid.length() < length){
|
061
|
for(inti=0; i<length-uuid.length(); i++){
|
062
|
uuid = uuid + Math.round(Math.random()*9);
|
066
|
returnuuid.replaceAll("a","1").replaceAll("b","2").replaceAll("c","3").replaceAll("d","4").replaceAll("e","5").replaceAll("f","6");
|
075
|
* @return boolean 空则返回true,非空则flase
|
077
|
publicstaticbooleanisEmpty(String input) {
|
078
|
returnnull==input ||0==input.length() ||0==input.replaceAll("\\s","").length();
|
084
|
* @return boolean 空则返回true,非空则flase
|
086
|
publicstaticbooleanisEmpty(byte[] bytes){
|
087
|
returnnull==bytes ||0==bytes.length;
|
092
|
* 从org.apache.mina.core.buffer.IoBuffer中读取字符串
|
094
|
* @see 若想自己指定字符集,可以使用<code>getStringFromIoBuffer(IoBuffer buffer, int size, String charset)</code>方法
|
095
|
* @param size 所要读取的字节数
|
097
|
publicstaticString getStringFromIoBuffer(IoBuffer buffer,intsize){
|
098
|
returngetStringFromIoBuffer(buffer, size,"GBK");
|
103
|
* 从org.apache.mina.core.buffer.IoBuffer中读取字符串
|
104
|
* @param size 所要读取的字节数
|
105
|
* @param charset 解码的字符集
|
107
|
publicstaticString getStringFromIoBuffer(IoBuffer buffer,intsize, String charset){
|
110
|
result = buffer.getString(size, Charset.forName(charset).newDecoder());
|
111
|
}catch(CharacterCodingException e) {
|
112
|
LogUtil.getLogger().error("字符解码异常,自动切换第二种解码方式,本次的堆栈信息如下", e);
|
114
|
result =newString(buffer.array(), charset);
|
115
|
}catch(UnsupportedEncodingException ee) {
|
116
|
LogUtil.getLogger().error("字符解码异常,系统不支持该字符集["+ charset +"],本次的堆栈信息如下", ee);
|
125
|
* @see 本方法用到了反射,其适用于所有的属性类型均为byte[]的JavaBean
|
126
|
* @return String field11=value11 field22=value22 field33=value33
|
128
|
publicstaticString getStringFromObjectForByte(Object obj){
|
129
|
StringBuilder sb =newStringBuilder();//局部的StringBuffer一律StringBuilder之
|
130
|
sb.append(obj.getClass().getName()).append("@").append(obj.hashCode()).append("[");
|
131
|
for(Field field : obj.getClass().getDeclaredFields()){
|
132
|
String methodName ="get"+ StringUtils.capitalize(field.getName());//构造getter方法
|
133
|
Object fieldValue =null;
|
135
|
fieldValue = obj.getClass().getDeclaredMethod(methodName).invoke(obj);//执行getter方法,获取其返回值
|
137
|
//一旦发生异常,便将属性值置为UnKnown,故此处没必要一一捕获所有异常
|
138
|
sb.append("\n").append(field.getName()).append("=UnKnown");
|
141
|
if(fieldValue ==null){
|
142
|
sb.append("\n").append(field.getName()).append("=null");
|
144
|
sb.append("\n").append(field.getName()).append("=").append(newString((byte[])fieldValue));
|
147
|
returnsb.append("\n]").toString();
|
153
|
* @see 由于Map.toString()打印出来的参数值对,是横着一排的...参数多的时候,不便于查看各参数值
|
154
|
* @see 故此仿照commons-lang.jar中的ReflectionToStringBuilder.toString()编写了本方法
|
155
|
* @return String key11=value11 \n key22=value22 \n key33=value33 \n......
|
157
|
publicstaticString getStringFromMap(Map<String, String> map){
|
158
|
StringBuilder sb =newStringBuilder();
|
159
|
sb.append(map.getClass().getName()).append("@").append(map.hashCode()).append("[");
|
160
|
for(Map.Entry<String,String> entry : map.entrySet()){
|
161
|
sb.append("\n").append(entry.getKey()).append("=").append(entry.getValue());
|
163
|
returnsb.append("\n]").toString();
|
169
|
* @see 该方法的参数适用于打印Map<String, byte[]>的情况
|
170
|
* @return String key11=value11 \n key22=value22 \n key33=value33 \n......
|
172
|
publicstaticString getStringFromMapForByte(Map<String,byte[]> map){
|
173
|
StringBuilder sb =newStringBuilder();
|
174
|
sb.append(map.getClass().getName()).append("@").append(map.hashCode()).append("[");
|
175
|
for(Map.Entry<String,byte[]> entry : map.entrySet()){
|
176
|
sb.append("\n").append(entry.getKey()).append("=").append(newString(entry.getValue()));
|
178
|
returnsb.append("\n]").toString();
|
184
|
* @see 该方法的参数适用于打印Map<String, Object>的情况
|
185
|
* @return String key11=value11 \n key22=value22 \n key33=value33 \n......
|
187
|
publicstaticString getStringFromMapForObject(Map<String, Object> map){
|
188
|
StringBuilder sb =newStringBuilder();
|
189
|
sb.append(map.getClass().getName()).append("@").append(map.hashCode()).append("[");
|
190
|
for(Map.Entry<String,Object> entry : map.entrySet()){
|
191
|
sb.append("\n").append(entry.getKey()).append("=").append(entry.getValue().toString());
|
193
|
returnsb.append("\n]").toString();
|
199
|
* @see 注意:该方法可处理贰仟万以内的金额,且若有小数位,则不限小数位的长度
|
200
|
* @see 注意:如果你的金额达到了贰仟万以上,则不推荐使用该方法,否则计算出来的结果会令人大吃一惊
|
201
|
* @param amount 金额的元进制字符串
|
202
|
* @return String 金额的分进制字符串
|
204
|
publicstaticString moneyYuanToFen(String amount){
|
209
|
if(-1== amount.indexOf(".")){
|
210
|
returnInteger.parseInt(amount) *100+"";
|
212
|
//传入的金额字符串里面含小数点-->取小数点前面的字符串,并将之转换成单位为分的整数表示
|
213
|
intmoney_fen = Integer.parseInt(amount.substring(0, amount.indexOf("."))) *100;
|
215
|
String pointBehind = (amount.substring(amount.indexOf(".") +1));
|
217
|
if(pointBehind.length() ==1){
|
218
|
returnmoney_fen + Integer.parseInt(pointBehind)*10+"";
|
221
|
intpointString_1 = Integer.parseInt(pointBehind.substring(0,1));
|
223
|
intpointString_2 = Integer.parseInt(pointBehind.substring(1,2));
|
224
|
//amount==12.03,amount=12.00,amount=12.30
|
225
|
if(pointString_1 ==0){
|
226
|
returnmoney_fen + pointString_2 +"";
|
228
|
returnmoney_fen + pointString_1*10+ pointString_2 +"";
|
235
|
* @see 该方法会将金额中小数点后面的数值,四舍五入后只保留两位....如12.345-->12.35
|
236
|
* @see 注意:该方法可处理贰仟万以内的金额
|
237
|
* @see 注意:如果你的金额达到了贰仟万以上,则非常不建议使用该方法,否则计算出来的结果会令人大吃一惊
|
238
|
* @param amount 金额的元进制字符串
|
239
|
* @return String 金额的分进制字符串
|
241
|
publicstaticString moneyYuanToFenByRound(String amount){
|
245
|
if(-1== amount.indexOf(".")){
|
246
|
returnInteger.parseInt(amount) *100+"";
|
248
|
intmoney_fen = Integer.parseInt(amount.substring(0, amount.indexOf("."))) *100;
|
249
|
String pointBehind = (amount.substring(amount.indexOf(".") +1));
|
250
|
if(pointBehind.length() ==1){
|
251
|
returnmoney_fen + Integer.parseInt(pointBehind)*10+"";
|
253
|
intpointString_1 = Integer.parseInt(pointBehind.substring(0,1));
|
254
|
intpointString_2 = Integer.parseInt(pointBehind.substring(1,2));
|
255
|
//下面这种方式用于处理pointBehind=245,286,295,298,995,998等需要四舍五入的情况
|
256
|
if(pointBehind.length() >2){
|
257
|
intpointString_3 = Integer.parseInt(pointBehind.substring(2,3));
|
258
|
if(pointString_3 >=5){
|
259
|
if(pointString_2 ==9){
|
260
|
if(pointString_1 ==9){
|
261
|
money_fen = money_fen +100;
|
265
|
pointString_1 = pointString_1 +1;
|
269
|
pointString_2 = pointString_2 +1;
|
273
|
if(pointString_1 ==0){
|
274
|
returnmoney_fen + pointString_2 +"";
|
276
|
returnmoney_fen + pointString_1*10+ pointString_2 +"";
|
283
|
* @see 注意:如果传入的参数中含小数点,则直接原样返回
|
284
|
* @see 该方法返回的金额字符串格式为<code>00.00</code>,其整数位有且至少有一个,小数位有且长度固定为2
|
285
|
* @param amount 金额的分进制字符串
|
286
|
* @return String 金额的元进制字符串
|
288
|
publicstaticString moneyFenToYuan(String amount){
|
292
|
if(amount.indexOf(".") > -1){
|
295
|
if(amount.length() ==1){
|
297
|
}elseif(amount.length() ==2){
|
300
|
returnamount.substring(0, amount.length()-2) +"."+ amount.substring(amount.length()-2);
|
307
|
* @see 该方法默认以ISO-8859-1转码
|
308
|
* @see 若想自己指定字符集,可以使用<code>getString(byte[] data, String charset)</code>方法
|
310
|
publicstaticString getString(byte[] data){
|
311
|
returngetString(data,"ISO-8859-1");
|
317
|
* @see 如果系统不支持所传入的<code>charset</code>字符集,则按照系统默认字符集进行转换
|
319
|
publicstaticString getString(byte[] data, String charset){
|
323
|
if(isEmpty(charset)){
|
324
|
returnnewString(data);
|
327
|
returnnewString(data, charset);
|
328
|
}catch(UnsupportedEncodingException e) {
|
329
|
LogUtil.getLogger().error("将byte数组["+ data +"]转为String时发生异常:系统不支持该字符集["+ charset +"]");
|
330
|
returnnewString(data);
|
337
|
* @return String 返回的字符串格式类似于"abcd***hijk"
|
339
|
publicstaticString getStringSimple(String data){
|
340
|
returndata.substring(0,4) +"***"+ data.substring(data.length()-4);
|
346
|
* @see 该方法默认以ISO-8859-1转码
|
347
|
* @see 若想自己指定字符集,可以使用<code>getBytes(String str, String charset)</code>方法
|
349
|
publicstaticbyte[] getBytes(String data){
|
350
|
returngetBytes(data,"ISO-8859-1");
|
356
|
* @see 如果系统不支持所传入的<code>charset</code>字符集,则按照系统默认字符集进行转换
|
358
|
publicstaticbyte[] getBytes(String data, String charset){
|
359
|
data = (data==null?"": data);
|
360
|
if(isEmpty(charset)){
|
361
|
returndata.getBytes();
|
364
|
returndata.getBytes(charset);
|
365
|
}catch(UnsupportedEncodingException e) {
|
366
|
LogUtil.getLogger().error("将字符串["+ data +"]转为byte[]时发生异常:系统不支持该字符集["+ charset +"]");
|
367
|
returndata.getBytes();
|
373
|
* 根据指定的签名密钥和算法签名Map<String,String>
|
374
|
* @see 方法内部首先会过滤Map<String,String>参数中的部分键值对
|
375
|
* @see 过滤规则:移除键名为"cert","hmac","signMsg"或者键值为null或者键值长度为零的键值对
|
376
|
* @see 过滤结果:过滤完Map<String,String>后会产生一个字符串,其格式为[key11=value11|key22=value22|key33=value33]
|
377
|
* @see And the calls {@link TradePortalUtil#getHexSign(String,String,String,boolean)}进行签名
|
378
|
* @param param 待签名的Map<String,String>
|
379
|
* @param charset 签名时转码用到的字符集
|
380
|
* @param algorithm 签名时所使用的算法,从业务上看,目前其可传入两个值:MD5,SHA-1
|
381
|
* @param signKey 签名用到的密钥
|
382
|
* @return String algorithm digest as a lowerCase hex string
|
384
|
publicstaticString getHexSign(Map<String, String> param, String charset, String algorithm, String signKey){
|
385
|
StringBuilder sb =newStringBuilder();
|
386
|
List<String> keys =newArrayList<String>(param.keySet());
|
387
|
Collections.sort(keys);
|
388
|
for(inti=0; i<keys.size(); i++){
|
389
|
String key = keys.get(i);
|
390
|
String value = param.get(key);
|
391
|
if(key.equalsIgnoreCase("cert") || key.equalsIgnoreCase("hmac") || key.equalsIgnoreCase("signMsg") || value==null|| value.length()==0){
|
394
|
sb.append(key).append("=").append(value).append("|");
|
396
|
sb.append("key=").append(signKey);
|
397
|
returngetHexSign(sb.toString(), charset, algorithm,true);
|
403
|
* @see Calculates the algorithm digest and returns the value as a hex string
|
404
|
* @see If system dosen't support this <code>algorithm</code>, return "" not null
|
405
|
* @see It will Calls {@link TradePortalUtil#getBytes(String str, String charset)}
|
406
|
* @see 若系统不支持<code>charset</code>字符集,则按照系统默认字符集进行转换
|
407
|
* @see 若系统不支持<code>algorithm</code>算法,则直接返回""空字符串
|
408
|
* @see 另外,commons-codec.jar提供的DigestUtils.md5Hex(String data)与本方法getHexSign(data, "UTF-8", "MD5", false)效果相同
|
409
|
* @param data Data to digest
|
410
|
* @param charset 字符串转码为byte[]时使用的字符集
|
411
|
* @param algorithm 目前其有效值为<code>MD5,SHA,SHA1,SHA-1,SHA-256,SHA-384,SHA-512</code>
|
412
|
* @param toLowerCase 指定是否返回小写形式的十六进制字符串
|
413
|
* @return String algorithm digest as a lowerCase hex string
|
415
|
publicstaticString getHexSign(String data, String charset, String algorithm,booleantoLowerCase){
|
416
|
char[] DIGITS_LOWER = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
|
417
|
char[] DIGITS_UPPER = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
|
418
|
//Used to build output as Hex
|
419
|
char[] DIGITS = toLowerCase ? DIGITS_LOWER : DIGITS_UPPER;
|
420
|
//get byte[] from {@link TradePortalUtil#getBytes(String, String)}
|
421
|
byte[] dataBytes = getBytes(data, charset);
|
422
|
byte[] algorithmData =null;
|
424
|
//get an algorithm digest instance
|
425
|
algorithmData = MessageDigest.getInstance(algorithm).digest(dataBytes);
|
426
|
}catch(NoSuchAlgorithmException e) {
|
427
|
LogUtil.getLogger().error("签名字符串["+ data +"]时发生异常:System doesn't support this algorithm["+ algorithm +"]");
|
430
|
char[] respData =newchar[algorithmData.length <<1];
|
431
|
//two characters form the hex value
|
432
|
for(inti=0,j=0; i<algorithmData.length; i++){
|
433
|
respData[j++] = DIGITS[(0xF0& algorithmData[i]) >>>4];
|
434
|
respData[j++] = DIGITS[0x0F& algorithmData[i]];
|
436
|
returnnewString(respData);
|
442
|
* @see 该方法默认会以UTF-8编码字符串
|
443
|
* @see 若想自己指定字符集,可以使用<code>encode(String chinese, String charset)</code>方法
|
445
|
publicstaticString encode(String chinese){
|
446
|
returnencode(chinese,"UTF-8");
|
452
|
* @see 该方法通常用于对中文进行编码
|
453
|
* @see 若系统不支持指定的编码字符集,则直接将<code>chinese</code>原样返回
|
455
|
publicstaticString encode(String chinese, String charset){
|
456
|
chinese = (chinese==null?"": chinese);
|
458
|
returnURLEncoder.encode(chinese, charset);
|
459
|
}catch(UnsupportedEncodingException e) {
|
460
|
LogUtil.getLogger().error("编码字符串["+ chinese +"]时发生异常:系统不支持该字符集["+ charset +"]");
|
468
|
* @see 该方法默认会以UTF-8解码字符串
|
469
|
* @see 若想自己指定字符集,可以使用<code>decode(String chinese, String charset)</code>方法
|
471
|
publicstaticString decode(String chinese){
|
472
|
returndecode(chinese,"UTF-8");
|
478
|
* @see 该方法通常用于对中文进行解码
|
479
|
* @see 若系统不支持指定的解码字符集,则直接将<code>chinese</code>原样返回
|
481
|
publicstaticString decode(String chinese, String charset){
|
482
|
chinese = (chinese==null?"": chinese);
|
484
|
returnURLDecoder.decode(chinese, charset);
|
485
|
}catch(UnsupportedEncodingException e) {
|
486
|
LogUtil.getLogger().error("解码字符串["+ chinese +"]时发生异常:系统不支持该字符集["+ charset +"]");
|
494
|
* @see 该方法默认采用空格(其ASCII码为32)来右补字符
|
495
|
* @see 若想自己指定所补字符,可以使用<code>rightPadForByte(String str, int size, int padStrByASCII)</code>方法
|
497
|
publicstaticString rightPadForByte(String str,intsize){
|
498
|
returnrightPadForByte(str, size,32);
|
504
|
* @see 若str对应的byte[]长度不小于size,则按照size截取str对应的byte[],而非原样返回str
|
505
|
* @see 所以size参数很关键..事实上之所以这么处理,是由于支付处理系统接口文档规定了字段的最大长度
|
506
|
* @see 若对普通字符串进行右补字符,建议org.apache.commons.lang.StringUtils.rightPad(...)
|
507
|
* @param size 该参数指的不是字符串长度,而是字符串所对应的byte[]长度
|
508
|
* @param padStrByASCII 该值为所补字符的ASCII码,如32表示空格,48表示0,64表示@等
|
510
|
publicstaticString rightPadForByte(String str,intsize,intpadStrByASCII){
|
511
|
byte[] srcByte = str.getBytes();
|
512
|
byte[] destByte =null;
|
513
|
if(srcByte.length >= size){
|
514
|
//由于size不大于原数组长度,故该方法此时会按照size自动截取,它会在数组右侧填充'(byte)0'以使其具有指定的长度
|
515
|
destByte = Arrays.copyOf(srcByte, size);
|
517
|
destByte = Arrays.copyOf(srcByte, size);
|
518
|
Arrays.fill(destByte, srcByte.length, size, (byte)padStrByASCII);
|
520
|
returnnewString(destByte);
|
526
|
* @see 该方法默认采用空格(其ASCII码为32)来左补字符
|
527
|
* @see 若想自己指定所补字符,可以使用<code>leftPadForByte(String str, int size, int padStrByASCII)</code>方法
|
529
|
publicstaticString leftPadForByte(String str,intsize){
|
530
|
returnleftPadForByte(str, size,32);
|
536
|
* @see 若str对应的byte[]长度不小于size,则按照size截取str对应的byte[],而非原样返回str
|
537
|
* @see 所以size参数很关键..事实上之所以这么处理,是由于支付处理系统接口文档规定了字段的最大长度
|
538
|
* @param padStrByASCII 该值为所补字符的ASCII码,如32表示空格,48表示0,64表示@等
|
540
|
publicstaticString leftPadForByte(String str,intsize,intpadStrByASCII){
|
541
|
byte[] srcByte = str.getBytes();
|
542
|
byte[] destByte =newbyte[size];
|
543
|
Arrays.fill(destByte, (byte)padStrByASCII);
|
544
|
if(srcByte.length >= size){
|
545
|
System.arraycopy(srcByte,0, destByte,0, size);
|
547
|
System.arraycopy(srcByte,0, destByte, size-srcByte.length, srcByte.length);
|
549
|
returnnewString(destByte);
|
555
|
* @see 经测试,针对闰年02月份或跨年等情况,该代码仍有效。测试代码如下
|
556
|
* @see calendar.set(Calendar.YEAR, 2013);
|
557
|
* @see calendar.set(Calendar.MONTH, 0);
|
558
|
* @see calendar.set(Calendar.DATE, 1);
|
559
|
* @see 测试时,将其放到<code>calendar.add(Calendar.DATE, -1);</code>前面即可
|
560
|
* @return 返回的日期格式为yyyyMMdd
|
562
|
publicstaticString getYestoday(){
|
563
|
Calendar calendar = Calendar.getInstance();
|
564
|
calendar.add(Calendar.DATE, -1);
|
565
|
returnnewSimpleDateFormat("yyyyMMdd").format(calendar.getTime());
|
572
|
publicstaticString getCurrentDate(){
|
573
|
returnnewSimpleDateFormat("yyyyMMdd").format(newDate());
|
578
|
* 获取当前的时间yyyyMMddHHmmss
|
580
|
publicstaticString getCurrentTime(){
|
581
|
returnnewSimpleDateFormat("yyyyMMddHHmmss").format(newDate());
|
587
|
* @see 对输入参数中的敏感字符进行过滤替换,防止用户利用JavaScript等方式输入恶意代码
|
588
|
* @see String input = <img src='http://t1.baidu.com/it/fm=0&gp=0.jpg'/>
|
589
|
* @see HtmlUtils.htmlEscape(input); //from spring.jar
|
590
|
* @see StringEscapeUtils.escapeHtml(input); //from commons-lang.jar
|
591
|
* @see 尽管Spring和Apache都提供了字符转义的方法,但Apache的StringEscapeUtils功能要更强大一些
|
592
|
* @see StringEscapeUtils提供了对HTML,Java,JavaScript,SQL,XML等字符的转义和反转义
|
593
|
* @see 但二者在转义HTML字符时,都不会对单引号和空格进行转义,而本方法则提供了对它们的转义
|
594
|
* @return String 过滤后的字符串
|
596
|
publicstaticString htmlEscape(String input) {
|
600
|
input = input.replaceAll("&","&");
|
601
|
input = input.replaceAll("<","<");
|
602
|
input = input.replaceAll(">",">");
|
603
|
input = input.replaceAll(" "," ");
|
604
|
input = input.replaceAll("'","'"); //IE暂不支持单引号的实体名称,而支持单引号的实体编号,故单引号转义成实体编号,其它字符转义成实体名称
|
605
|
input = input.replaceAll("\"",""");//双引号也需要转义,所以加一个斜线对其进行转义
|
606
|
input = input.replaceAll("\n","<br/>"); //不能把\n的过滤放在前面,因为还要对<和>过滤,这样就会导致<br/>失效了
|
转载于:https://my.oschina.net/u/1012289/blog/151701
Java开发常用工具类相关推荐
- java escape工具类_java开发常用工具类
在Java中,,工具类定义了一组公共方法.你把你的类继承这些类或者实现这些接口,就可以使用这些类的方法了.下面给大家介绍一下十六种最常用的java开发常用工具类. 一. org.apache.comm ...
- Android开发常用工具类集合
转载自:https://blog.csdn.net/xiaoyi_tdcq/article/details/52902844 Android开发常用工具类集合 android开发中为了避免重复造轮子, ...
- java 操作vss,java开发常用工具总结,java开发常用工具
java开发常用工具总结,java开发常用工具 1.editplus editplus 是我使用最频繁的工具,不管是java程序还是其他的语言的程序,本人都使用它,方便好用,速度快.如果配置好的话,可 ...
- java inputtools_Java后台开发常用工具类
本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数据库连接.格式转换.文件操作.发送邮件等等.提高开发效率,欢迎收藏与转载. 数据库连接工具类 数据库连接工具类--仅仅获得连接对象 ...
- Android开发常用工具类
来源于http://www.open-open.com/lib/view/open1416535785398.html 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前 ...
- java web 常用工具类_Javaweb常用工具类及配置文件备份
做一个代码备份,以后常用到的. hibernate工具类备份 package com.dly.service; /* * hibernate获取session 的工具类 */ import java. ...
- (转)Android开发常用工具类
原地址:http://blog.csdn.net/axi295309066/article/details/52884973 不管是前端,后端,还是我们的Android开发,实际工作中都会用到很多的工 ...
- java开发常用工具、github加速工具、idea插件
java常用工具 开源终端工具:Tabby 非开源的终端工具:xshell 开源数据库连接工具:DBeaver 开发工具:idea 社区版 文本工具:notepad++ 脑图:xmind 在线脑图:p ...
- 一、java项目常用工具类之加密工具类
项目环境: jdk1.8+spring4.3.12 一.问题描述及试用场景: 在项目规范中,有时需要对一些数据进行加密解密,常见的就是前后端加密参数在网络上传输.一方面,数据在网络上是以加密的方式传输 ...
最新文章
- 浅析应届女生找工作的一些忧虑和困惑
- hdu4908 中位数子串
- C代码中的命名方式总结和改进
- python实现队列_Python学习教程:用队列实现栈
- 结构体structure
- addeventlistener不支持ajax_好程序员web前端学习路线分享了解AJAX是什么
- 【jQuery笔记Part4】01-jQuery-节点操作-添加节点-删除节点-复制节点
- python语言的主网址-Python爬取网址中多个页面的信息
- 《生物信息学》——李霞;;生信概念
- 基于51单片机的8x8x8LED光立方设计
- 卸载360后残余文件无法删除
- iphone模拟器安装app
- 烦人的 1KB 1KB文件夹快捷方式病毒专杀
- 转回到Edison上开发
- 密码学基础(三)密码分析
- openpyxl学习笔记(2020--8-11)——制图续
- 宏碁(Acer)蜂鸟Fun 2020新款 14英寸轻薄商务笔记本使用真实评测
- 【无标题】C语言编写一个简单答题系统
- 人工智能实战2019 第0次作业 焦宇恒
- 屏幕扩展之将手机变成显示器-Wired Xdisplay
热门文章
- Git详细安装教程,翻译
- PHP仿代下狗源码-素材代下载搜索引擎系统整站打包
- Spring Cloud微服务之业务物理删除(十)
- ARP和RARP报头结构
- php gizp压缩传输js和css文件 - PHP
- UITabBarController 标签栏控制器-IOS开发 (实例)
- iPad iPhone程序增加和删除启动画面
- php 封装JavaScript类
- 16个SNS网站常用JS组件
- vins-mono后端优化