ページリストには、1515 **** 345と表示される15152462345などの携帯電話番号があります。
銀行カード番号62282542325242。ディスプレイ5242(下4桁)
当初はjsで処理されていましたが、カード番号がページのソースコードに残っていたため、顧客情報が漏洩していました
後で、<%@ taglib prefix = "bean" uri = "/ WEB-INF / struts-bean.tld"%>のbeanタグを使用し、属性はフォーマットでした
ただし、効果はありません。ソースコード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();
}
}
文字列であることが判明した場合は、直接スキップしてください。
したがって、このメソッドをオーバーライドするようにクラスをカスタマイズします
主な問題は、フォーマットを式にできないことです。最初の3桁+ **** +最後の4桁を取ります。%.3sが最初の3桁を取得するなど、最初の数桁を取得する機能のみがあります。
もちろん、フォーマットは正規表現と見なすことができますが、正規表現の最初の数桁は^。{0、n}であり、最後の4桁は。{4} $です。しかし、それでも1つの式に統合することはできません。
したがって、ホストはルールのみをカスタマイズできます。[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>即可
効果: