页面列表存在手机号,如15152462345,显示成1515****345。
银行卡号62282542325242。显示5242(后4位)
一开始是用js处理,但是卡号还是在页面源代码上,造成客户信息泄漏
后来用<%@ taglib prefix="bean" uri="/WEB-INF/struts-bean.tld" %> 的bean标签,有个属性是format
但是没有任何效果,查看源代码org.apache.struts.taglib.bean.WriteTag
protected String formatValue(Objeorg.apache.struts.taglib.beanct valueToFormat)
throws JspException {
Format format = null;
Object value = valueToFormat;
Locale locale =
TagUtils.getInstance().getUserLocale(pageContext, this.localeKey);
boolean formatStrFromResources = false;
String formatString = formatStr;
// Return String object as is.
if (value instanceof java.lang.String) {
return (String) value;
} else {
// Try to retrieve format string from resources by the key from
// formatKey.
if ((formatString == null) && (formatKey != null)) {
formatString = retrieveFormatString(this.formatKey);
if (formatString != null) {
formatStrFromResources = true;
}
}
// Prepare format object for numeric values.
if (value instanceof Number) {
if (formatString == null) {
if ((value instanceof Byte) || (value instanceof Short)
|| (value instanceof Integer)
|| (value instanceof Long)
|| (value instanceof BigInteger)) {
formatString = retrieveFormatString(INT_FORMAT_KEY);
} else if ((value instanceof Float)
|| (value instanceof Double)
|| (value instanceof BigDecimal)) {
formatString = retrieveFormatString(FLOAT_FORMAT_KEY);
}
if (formatString != null) {
formatStrFromResources = true;
}
}
if (formatString != null) {
try {
format = NumberFormat.getNumberInstance(locale);
if (formatStrFromResources) {
((DecimalFormat) format).applyLocalizedPattern(
formatString);
} else {
((DecimalFormat) format).applyPattern(formatString);
}
} catch (IllegalArgumentException e) {
JspException ex =
new JspException(messages.getMessage(
"write.format", formatString));
TagUtils.getInstance().saveException(pageContext, ex);
throw ex;
}
}
} else if (value instanceof java.util.Date) {
if (formatString == null) {
if (value instanceof java.sql.Timestamp) {
formatString =
retrieveFormatString(SQL_TIMESTAMP_FORMAT_KEY);
} else if (value instanceof java.sql.Date) {
formatString =
retrieveFormatString(SQL_DATE_FORMAT_KEY);
} else if (value instanceof java.sql.Time) {
formatString =
retrieveFormatString(SQL_TIME_FORMAT_KEY);
} else if (value instanceof java.util.Date) {
formatString = retrieveFormatString(DATE_FORMAT_KEY);
}
}
if (formatString != null) {
format = new SimpleDateFormat(formatString, locale);
}
}
}
if (format != null) {
return format.format(value);
} else {
return value.toString();
}
}
发现是字符串的话,直接跳过。
于是自定义个类覆盖此方法
主要有一个问题,format不能做到一个表达式,取前3位+****+取后4位。它只有取前几位的功能,如%.3s是取前3位
当然可以把format看成传入的是正则表达式,但是正则取前几位是^.{0,n},后4位是.{4}$。但是依然不能整合在一个表达式里。
扫描二维码关注公众号,回复:
12584079 查看本文章
所以楼主只能自定义个规则了 [L]%.ns[/L]表示取后n位,然后字符串取反,取前n位,然后再次取反,就是后n位
例如:
<bean:write name="termOrder" property="outPhone.mobile" format="%.3s****[L]%.4s[/L]" />
表示取前3位+****+后4位
附上代码
/**
*
*/
package org.apache.struts.taglib.bean;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.jsp.JspException;
import com.cupdata.telsales.util.StringUtils;
/**
* @author cruze([email protected]) 2014-7-1
*
*/
public class MyWriteTag extends WriteTag{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
/**
* 自定义format,主要是字符串没有格式化
* 如果[L]存在,则[L]%.4s取最后4位
* 例如%.3s**%.3s**[L]%.4s[/L]
* added by cruze at 2014-6-30
*/
protected String formatValue(Object valueToFormat) throws JspException {
String formatString = formatStr;
Object value = valueToFormat;
if (value instanceof java.lang.String && !StringUtils.isNull(value)
&& !StringUtils.isNull(formatString)) {
String inValue=value.toString();
//判断有几个%则加入几个变量
//如果存在[L],则变量要取反
//最后将[L]再次取反
//去掉[L]和[/L]
List<Object> para=new ArrayList<Object>();
for(int i=0;i<formatString.length();i++){
if('%'==formatString.charAt(i)){
if(i>2&&"[L]".equals(formatString.substring(i-3, i))){
//字符串取反
para.add(org.apache.commons.lang.StringUtils.reverse(inValue));
}
else{
para.add(value);
}
}
}
//格式化
String res=String.format(formatString,para.toArray());
String returnRes=new String(res);
Pattern p = Pattern.compile("\\[L](.*?)\\[/L]");
Matcher m = p.matcher(res);
while(m.find()) {
String find=m.group().substring(3, m.group().length()-4);
String xifu=org.apache.commons.lang.StringUtils.reverse(find);
String tmp=returnRes.replace(m.group(), xifu);
returnRes=null;
returnRes=tmp;
}
return returnRes;
}
return super.formatValue(valueToFormat);
}
}
修改struts-bean.tld的
<tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>改为<tagclass>org.apache.struts.taglib.bean.MyWriteTag</tagclass>即可
效果: