중국어 도메인 이름 메일 주소 전송에 대한 문제
먼저 문제가 발생한 코드를 다음과 같이 나열합니다.
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;
결과는 실행할 수 있습니다. 이 두 단락의 코드는 중국어에서 왜 다르게 실행되는지 판단해 보십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제4혹: 속성이 동적 귀속됩니까?모두가 알다시피 방법은 동태적으로 귀속될 수 있다. 하위 클래스가 상위 클래스로 전환될 때 가상 기기는 실행 대상의 진정한 유형을 찾을 수 있고 대상의 진정한 유형에 따라 하위 클래스를 호출하는 방법인지 하위 클래스...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.