jspのインターセプト文字列

ページリストには、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>即可


効果:


おすすめ

転載: blog.csdn.net/penkee/article/details/36191073