중국어 도메인 이름 메일 주소 전송에 대한 문제

최근 회사의 요구 사항 중 하나는 메일박스 주소를 입력하려면 중국어 도메인 이름을 입력해야 한다는 것이다.이전의 코드는 제 동료가 쓴 것입니다. 그리고 코드에 문제가 있는지 확인하라고 했습니다. 즉, 디버깅을 하라고 했습니다. IDE 환경은 XP에 있고 서버는 Unix에 배치되었습니다. 즉, 로컬 테스트를 통과한 후에 Unix에 배치해야 하기 때문에 번거롭지만 Unix에 웹 서버를 배치하는 것도 처음입니다.많이 배운 것 같아서.다음은 구체적인 문제에 대해 구체적으로 분석한다.
먼저 문제가 발생한 코드를 다음과 같이 나열합니다.
Action의 코드:
/**
	 *         
	 * 
	 * @struts.action path="/mailbox/controller/addr_forward/action"
	 * 
	 * */
	public ActionForward modifyPrefForwardAddr(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		ActionForward actionForward = super.getCommSucc(mapping);
		ActionForward failForward = super.getCommFail(mapping);

		ActionMessages errorMsg = new ActionMessages();

		ForwardAddrForm forwardForm = (ForwardAddrForm) form;

		String forward_add = forwardForm.getForwardAdd();
		String mailboxid = forwardForm.getMailboxId();
		String hideForwardAddStr = forwardForm.getHideForwardAdd();
		String tid = forwardForm.getTid();

		int hideForwardAddSumNumber = 3;// default value
		if (StringUtils.isNotBlank(hideForwardAdd_sum)) {
			try {
				hideForwardAddSumNumber = Integer.parseInt(hideForwardAdd_sum);
			} catch (NumberFormatException e) {
				e.printStackTrace();
			}
		}

		String[] hideForwardAddrArrays = new String[hideForwardAddSumNumber];

		String[] tmpHideForwardAddr = null;
		if (StringUtils.isNotBlank(hideForwardAddStr)) {
			//log.warn(hideForwardAddStr);
			hideForwardAddStr = hideForwardAddStr.trim();
			tmpHideForwardAddr = hideForwardAddStr.split(",");
		}

		if (tmpHideForwardAddr != null) {
			int count = 0;
			for (String addr : tmpHideForwardAddr) {
				//.warn("HideForwardAddress: " + addr);
				if (StringUtils.isNotBlank(addr)
						&& KennyUtil.isValidatorEmail(addr)) {
					//log.warn("Pass");
					hideForwardAddrArrays[count] = addr;
					count++;
					if (count == hideForwardAddSumNumber)
						break;
				} else {
					// do nothing
					//log.warn("Ban");
				}
			}
		}

		if (StringUtils.isBlank(tid) || StringUtils.isBlank(mailboxid)) {
			return null;
		}

		Mailbox mailbox = new Mailbox();
		mailbox.setId(mailboxid);
		mailbox.setMailboxTmailId(tid);

		if (!KennyUtil.isValidatorEmail(forward_add)) {
			forward_add = null;
		}

		try {
			AccBus.modifyAccountMailForwardingAddress(mailbox,
					hideForwardAddrArrays, forward_add);
			// AccBus.modifyMailboxPrefForwardAdd(mailbox, forward_add);
		} catch (ServiceException e) {
			// e.printStackTrace();
			TreeExceptionFactory.serviceErrorReturn(failForward, errorMsg, e);
			addMessages(request, errorMsg);
			return failForward;
		}

		return actionForward;
	}

중국어 문자 코드를 확인합니다.
/**
	 *           
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isValidatorChinese(String str) {
//		boolean flag = str.length() != str.getBytes().length;
//		return flag;
		boolean flag = false;
		if (str != null) {
			char[] strCharArray = str.toCharArray();
			log.warn("strCharArray");
			for (int i = 0, l = strCharArray.length; i != l; ++i) {
				log.warn("for begin");
				if (java.lang.Character.toString(strCharArray[i]).matches(
						"[ \\u4E00-\\u9FA5]+")) {
					flag = true;
					break;
				}
			}
		}
		return flag;
	}

사서함 위치가 올바른 코드인지 확인하려면:
/**
	 *           
	 * 
	 * @param emailAddress
	 * @return
	 */
	public static boolean isValidatorEmail(String emailAddress) {
		boolean flag = GenericValidator.isEmail(emailAddress);
		log.warn("before==>" + flag);
		if (!flag && isValidatorChinese(emailAddress)) {
			//          ,       。
			log.warn("inner==>" + flag);
			int dian = emailAddress.indexOf('.');
			int at = emailAddress.indexOf('@');
			if (dian > 0 && at > 0) {
				flag = true;
			}
		}
		log.warn("after==>" + flag);
		return flag;
	}
 
 
문제 1: 동일한 웹 패키지가 서로 다른 서버에서 실행되면 결과가 다릅니다.우리 회사 201 서버에서 실행하면 중국어 도메인 이름 메일박스 전송 주소를 추가할 수 있지만 가상 기기로 설치된 217과 210 서버에서는 사용할 수 없습니다.
시도 방법 1: 나는 이런 상황에 대해 로그로 Action에 있는 것을 추적한 다음 유닉스에서 코드가 엉망인지 확인합니다.나는 로컬과 env로 201의 UTF-8217의 것도 UTF-8이고 210의 것도 C(나도 이게 무슨 인코딩인지 모르겠다)라는 것을 발견했다. 그러나 어느 서버에서든 테스트가 엉망진창이었다. 그런데 이상하기 때문에 이런 보기 시스템 인코딩은 문제의 해결 방법이 아니다.어떤 것들은 작용하겠지만 적어도 지금은 나한테 안 돼.
시도 방법2: 그래서 다음 단계의 판단, 페이지의 판단을 계속 진행한다. 그래서 나는 다른 페이지를 만들어서 교체했다. 결과는 안 되고 페이지는 현실적으로 정상적이며 페이지와 무관하다.
시도 방법 3: JS의 검사를 실시하고 끊임없이alert()를 실시한 결과 호출된 JS는 모두 정상이고 이런 방법은 배제되었다.
시도 방법 4: 나는 우리의 데이터베이스 인코딩을 보았지만 모두 GBK였다.생각해 봐, 이것은 데이터베이스 인코딩과 그다지 큰 영향을 미치지 않을 것이다. 왜냐하면 다른 페이지에서는 모두 정상적으로 나타날 수 있기 때문이다.이런 방법은 또 배제되었다.
시도 방법 5: 마지막으로 나는 다시 자세하게 JAVA 백엔드 코드의 디버깅을 진행할 것이다.그 결과 Acion에서 검사를 호출하는 방법에 문제가 있는 것을 발견하고 따라가서 이 코드의 운행 결과가 어떻게false인지 발견했다.
public static boolean isValidatorEmail(String emailAddress) {
		boolean flag = GenericValidator.isEmail(emailAddress);
		log.warn("before==>" + flag);
		if (!flag && isValidatorChinese(emailAddress)) {
			//          ,       。
			log.warn("inner==>" + flag);
			int dian = emailAddress.indexOf('.');
			int at = emailAddress.indexOf('@');
			if (dian > 0 && at > 0) {
				flag = true;
			}
		}
		log.warn("after==>" + flag);
		return flag;

그래서 이 방법을 찾았어요.
isValidatorChinese

이전 코드는
boolean flag = str.length() != str.getBytes().length;
return flag;

변경된 코드는 다음과 같습니다.
boolean flag = false;
		if (str != null) {
			char[] strCharArray = str.toCharArray();
			log.warn("strCharArray");
			for (int i = 0, l = strCharArray.length; i != l; ++i) {
				log.warn("for begin");
				if (java.lang.Character.toString(strCharArray[i]).matches(
						"[ \\u4E00-\\u9FA5]+")) {
					flag = true;
					break;
				}
			}
		}
		return flag;

결과는 실행할 수 있습니다. 이 두 단락의 코드는 중국어에서 왜 다르게 실행되는지 판단해 보십시오.

좋은 웹페이지 즐겨찾기