Skip to content

10.12UserAccount(SSO)修订

一、流程

###1.工作流

phoneregister-webflow.xml

xml
<flow xmlns="http://www.springframework.org/schema/webflow"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/webflow
                          http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">

    <var name="phoneRegistration" class="com.supermap.icloud.cas.model.ICloudPhoneRegistration"/>

    <on-start>
        <evaluate expression="initialICloudFlowSetupAction" />
    </on-start>

    <view-state id="viewRegisterForm" view="casPhoneRegisterView" model="phoneRegistration">
        <binder>
            <binding property="phoneNumber"/>
            <binding property="nickname"/>
            <binding property="password"/>
            <binding property="SMSVerifyCode"/>
            <binding property="username"/>
            <binding property="companyname"/>
        </binder>
        <on-entry>
            <set name="viewScope.commandName" value="'phoneRegistration'"></set>
        </on-entry>
        <transition on="send" bind="true" validate="false">
            <evaluate expression="registrationViaFormAction.doSend(flowRequestContext,flowScope.phoneRegistration)" />
        </transition>
        <transition on="register" bind="true" validate="true" to="checkSMSVerifyCode">
            <evaluate expression="registrationViaFormAction.resetStatus(flowRequestContext,flowScope.phoneRegistration)" />
        </transition>
    </view-state>

    <action-state id="checkSMSVerifyCode">
        <evaluate expression="registrationViaFormAction.doCheckSMSVerifyCode(flowRequestContext,flowScope.phoneRegistration)" />
        <transition on="success" to="userRegistration" />
        <transition on="error" to="handleAuthenticationFailure" />
    </action-state>

    <action-state id="userRegistration">
        <evaluate expression="registrationViaFormAction.doPhoneRegister(flowRequestContext,flowScope.phoneRegistration)" />
        <transition on="success" to="successView"/>
        <transition on="error" to="handleAuthenticationFailure"/>
    </action-state>

    <action-state id="handleAuthenticationFailure">
        <evaluate expression="icloudFlowExceptionHandler.handle(currentEvent.attributes.error, messageContext)" />
        <transition on="BadSafeCodeException" to="viewRegisterForm" />
    </action-state>

    <end-state id="successView" view="casPhoneRegisterSuccessView" />
</flow>
1.	ICloudPhoneRegistration		页面接收对象
2.	initialICloudFlowSetupAction    初始化  ,页面刷新触发
3.	viewRegisterForm			view绑定
	doSend 发送短信验证码	resetStatus 重置短信发送的状态
	
4.	checkSMSVerifyCode			validate="true"(有校验)
	doCheckSMSVerifyCode	检查短信验证码
5.	userRegistration
	doPhoneRegister			用户手机注册
6.	handleAuthenticationFailure  权限认证

###2.ICloudPhoneRegistration

继承ICloudEmailRegistration
接收页面对象
/**
	 * 姓名
	 */
	private String username;

	/**
	 * 单位名
	 */
	private String companyname;

新增 这两个字段及get,set方法

###3.ICloudUser

返回数据库对象
/**
	 * 姓名
	 */
	private String username = StringUtils.EMPTY;
	/**
	 * 单位名
	 */
	private String companyname = StringUtils.EMPTY;
新增 这两个字段及get,set方法

###4.工作流

工作流中view绑定
<binding property="username"/>
<binding property="companyname"/>
<binding property="email"/>

注:<binding property="email"/> 绑定页面的内容,去掉,会初始化默认的邮箱地址(受之前代码影响)

###5.PhoneRegistrationValidator

手机注册第一次校验
validate方法
//对新增的username和companyname进行常规验证
		if (!ValidatorUtils.validateUsername(reg.getUsername(), errors,
				"username")) {
			return;
		}

		if (!ValidatorUtils.validateCompanyname(reg.getCompanyname(), errors,
				"companyname")) {
			return;
		}

6.registrationViaFormAction 工作流

用户手机注册:
doPhoneRegister(final RequestContext context,
			final ICloudPhoneRegistration registration):

###5.1ValidatorUtils

public static boolean validateUsername(String username, Errors errors, String fieldName){
        // 验证username是否为空
        if(username.isEmpty()){
            errors.rejectValue(fieldName, "required.username");
            return false;
        }
        // 检查是否含有非法字符
        if(!CASCommonUtils.checkSQLInject(username)){
            errors.rejectValue(fieldName, "illegal.character");
            return false;
        }
        // 检查username格式
        if(!CASCommonUtils.checkParameterFormat(username)){
            errors.rejectValue(fieldName, "invalid.username");
            return false;
        }
        return true;
    }

    public static boolean validateCompanyname(String companyname, Errors errors, String fieldName){
        // 验证username是否为空
        if(companyname.isEmpty()){
            errors.rejectValue(fieldName, "required.companyname");
            return false;
        }
        // 检查是否含有非法字符
        if(!CASCommonUtils.checkSQLInject(companyname)){
            errors.rejectValue(fieldName, "illegal.character");
            return false;
        }
        // 检查username格式
        if(!CASCommonUtils.checkParameterFormat(companyname)){
            errors.rejectValue(fieldName, "invalid.companyname");
            return false;
        }
        return true;
    }
昵称,姓名,单位名称,校验有点重复

###5.2MessageCode.

USERSERVICE_VALIDATEUSERNAME_ILLEGAL, // 姓名不符合规则
USERSERVICE_VALIDATECOMPANYNAME_ILLEGAL, // 单位名不符合规则

3.casPhoneRegisterView

userService

注册手机用户
registPhoneUser(ICloudPhoneRegistration user):

1.	StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getCompanyname())

2.	 // 姓名验证
        validateMessage = validateUserName(user.getUsername());
        if (null != validateMessage) {
            result.setMessageCode(validateMessage);
            return result;
        }

        // 单位名称验证
        validateMessage = validateCompanyName(user.getCompanyname());
        if (null != validateMessage) {
            result.setMessageCode(validateMessage);
            return result;
        }

        // 邮箱验证
        validateMessage = validateEmail(user.getEmail());
        if (null != validateMessage) {
            result.setMessageCode(validateMessage);
            return result;
        }

###userDao

根据传入的索引字段,查询用户信息(邮箱或昵称)
getICloudUser(String username):
icloudUser.setUsername(rs.getString("username"));
icloudUser.setCompanyname(rs.getString("companyname"));

通过手机号来查询用户信息
getICloudUserByPhoneNumber(String phoneNumber):
icloudUser.setUsername(rs.getString("username"));
icloudUser.setCompanyname(rs.getString("companyname"));

根据userid来获取用户信息
getICloudUser(int uid):
icloudUser.setUsername(rs.getString("username"));
icloudUser.setCompanyname(rs.getString("companyname"));

增加手机新用户
addNewPhoneUser:
stmt.setString(7, reg.getUsername());
stmt.setString(8, reg.getCompanyname());



private static final String NEW_PHONE_REGISTRATION_SQL =
 "insert into users(email,encrypted_password,created_at,updated_at,confirmed_at,current_sign_in_ip,nickname,source,tel,username,companyname) values (?,?,now(),now(),now(),?,?,?,?,?,?)"

sql:

    private static final String NEW_PHONE_REGISTRATION_SQL = "insert into users(email,encrypted_password,created_at,updated_at,confirmed_at,current_sign_in_ip,nickname,source,tel) values (?,?,now(),now(),now(),?,?,?,?)";
    
  改:
  insert into users(email,encrypted_password,created_at,updated_at,confirmed_at,current_sign_in_ip,nickname,source,tel,username,companyname) values (?,?,now(),now(),now(),?,?,?,?,?,?)

##二、前端

###1.页面修改

####1.新增姓名和单位名,再加邮箱名,再调整顺序

jsp
casPhoneRegisterView.jsp
<%--姓名--%>
<div class="mt15">
<label for="username" class="register_label"><spring:message code="CasRegistererView_Form_Username"/></label>
<spring:message code="CasRegistererView_Form_UsernameTip" var="usernameTip"/>
<form:input id="username" name="username" type="text" placeholder='${usernameTip}'
path="username" cssErrorClass="input_wrong" />
</div>

<%--单位名--%>
<div class="mt15">
<label for="companyname" class="register_label"><spring:message code="CasRegistererView_Form_Companyname"/></label>
<spring:message code="CasRegistererView_Form_CompanynameTip" var="usernameTip"/>
<form:input id="companyname" name="companyname" type="text" placeholder='${usernameTip}'
path="companyname" cssErrorClass="input_wrong"/>
</div>

<%--邮箱--%>
<div class="mt15">
<label for="email" class="register_label"><spring:message code="CasRegistererView_Form_Email" /></label>
<spring:message code="CasRegistererView_Form_EmailTip" var="emailTip"/>
<form:input id="email" name="email" type="text" placeholder='${emailTip}'
path="email" cssErrorClass="input_wrong"/>
</div>

2.	label的code就是 显示的字
viewResource.properties
viewResource_zh.properties
viewResource_en.properties

viewResource.properties和viewResource_zh.properties都是中文:
CasRegistererView_Form_Username=姓名
CasRegistererView_Form_Companyname=单位名
CasRegistererView_Form_VerifyCode=短信验证码(原来的)
CasRegistererView_Form_VerifyCode=验证码
Top_Common_Register=注册超图账号


viewResource_en.properties是英文:
CasRegistererView_Form_Username=Username
CasRegistererView_Form_Companyname=Company
CasRegistererView_Form_VerifyCode=验证码
邮箱本来就有

2.输入框默认内容

每个输入框默认内容:
如:input里placeholder='${usernameTip}'
viewResource.properties
CasRegistererView_Form_NicknameTip=中英文、数字或下划线组成,不区分大小写(本来就有)
CasRegistererView_Form_UsernameTip=您的姓名
CasRegistererView_Form_CompanynameTip=您的单位名
CasRegistererView_Form_EmailTip=您的邮箱
CasRegistererView_Form_passwordTip=长度为6至30位,不可含有空格(原本的)
CasRegistererView_Form_passwordTip=长度为6-30位,不含空格(改后)
CasRegistererView_Form_PhoneTip=中国大陆手机号(本来就有,3个properties都有)
CasRegistererView_Form_VerifyCodeTip=请输入验证码


js:
关掉了:鼠标离开焦点,placeholder不显示的特效
register.js				
	注释213,217-220 关掉输入框placeholder的昵称事件
user.js
	注释508,509 关掉输入框placeholder的密码事件,切换以前设置的js中文,,(错误**,如果错误了,再写对无法对先前错误的消除)
	解决:casUI.js
	$password.removeClass(iSuperMap.Users.CSS.WRONGInput).attr("placeholder",
			iSuperMap.Lang.CasTip.TIP_PASSWORD_PATTERN);
			$password.removeClass(iSuperMap.Users.CSS.WRONGInput);
	
	注释474 密码失去焦点,移除placeholder的事件

###2.注册样式

住:修改regist.css和common.css

注意common.css会对其他页面有影响,所以采用新增

1.input输入框(考虑)

register.css的3行
.sso_block input[type="text"],.sso_block input[type="password"]{ width:355px;}
.sso_block input[type="text"],.sso_block input[type="password"]{
    width: 281px;
 }

2.input输入框内容字体(考虑)

D:\supermap\ideaworkspaces\UserAccount\accounts\src\main\webapp\style\common.css的67行
.sso_block input, .input_authNum {
    box-sizing: inherit;
    font-size: 15px;
    padding-left: 15px;
    color: #666666;
    margin-top: 10px;
    border: 1px solid #c5c5c5;
    border-radius: 6px 6px 6px 6px;
    height: 35px;
    line-height: 35px;
    transition: all 0.1s ease-in 0s;
}

.sso_block input, .input_authNum {
    box-sizing: inherit;
    font-size: 12px;
    padding-left: 12px;
    color:rgba(153,153,153,1);
    margin-top: 10px;
    height: 32px;
    line-height:24px;
    transition: all 0.1s ease-in 0s;
    font-weight:400;
    border:1px solid rgba(219,219,219,1);
	border-radius:2px;
	font-family: Microsoft YaHei;
}

####1.注册整体调整

D:\supermap\ideaworkspaces\UserAccount\accounts\src\main\webapp\style\common.css的43行添加
.width447{ width:447px; margin-left:auto;margin-right:auto;}
.width782{ width:782px; margin-left:230px;margin-right:auto;}

casPhoneRegisterView.jsp的23行
<div class="width447 pt50">
<div class="width782 pt50">

####2.让label和input并行

css
1. 是label变为行内块,让它和input并行	
D:\supermap\ideaworkspaces\UserAccount\accounts\src\main\webapp\style\register.css的2行
.register_label{display:block;}
.register_label{display:inline-block;}

2.	调整整个输入框位置
common.css的58行
.sso_block{ width:369px;border:1px solid #dfdfdf; border-top:none; border-bottom-color:#f2f2f2; box-shadow:0 1px 1px #ececec; padding:25px 38px 42px 38px; border-radius:0 0 6px 6px;}
.sso_block_phone{ width:450px;border:1px solid #dfdfdf; border-top:none; border-bottom-color:#f2f2f2; box-shadow:0 1px 1px #ececec; padding:25px 38px 42px 38px; border-radius:0 0 6px 6px;margin: 0 auto;}
**********会导致登录页面也变动
regist.css新增15行
.sso_block_regist{width: 450px}
casPhoneRegisterView.jsp的34行
<div class="sso_block mb75">
<div class="sso_block_regist sso_block mb75">

3.给label一个宽,对齐整个label
register.css的2行
.register_label{display:inline-block;}
.register_label{display:inline-block;width: 48px;text-align: right;}

4.label和input拉开24px
register.css的3行
.sso_block input[type="text"],.sso_block input[type="password"]{ width:355px;}
.sso_block input[type="text"],.sso_block input[type="password"]{width: 355px;margin-left: 24px;}

5.注册按钮有浮动对齐
register.css的14行
#registerButton {width:350px;height:40px;}
#registerButton {width:350px;height:40px;float: right;}

6.同意对齐
register.css的5行
.register_p{font-size:14px;color:#888888;text-shadow: 0 0 1px #cccccc;}
.register_p{font-size:14px;color:#888888;text-shadow: 0 0 1px #cccccc;margin-left: 80px;}

####3.input上下间距调整

html
casPhoneRegisterView.jsp的输入框的
昵称——验证码
<div class="mt25">
<div class="mt15">
协议
<div class="mt10">
<div class="mt25">
注册按钮
<div class="mt25">

####4.发送验证按钮调整

css
register.css的13行
#getVerifyCode {float:right;margin-top:10px;height:37px;}
#getVerifyCode {float:right;margin-top:14px;height:37px;}

####5.去掉邮箱和手机来回切换的

html
casPhoneRegisterView.jsp的24-33行
<%--<ul class="register_title">
<li id="orEmail" class="register_orEmail">
<span><img src="img/login/email_login.png"/></span>
<a href="register"><spring:message code="CasRegistererView_Form_Oremail"/></a>
</li>
<li id="orPhone" class="register_orPhone register_active">
<span><img src="img/login/phone_login.png"/></span>
<a href="javascript:;"><spring:message code="CasRegistererView_Form_Orphone"/></a>
</li>
</ul>--%>

####6.去掉boder边框

参照第2个的2个
common.css的58行
.sso_block{ width:369px;border:1px solid #dfdfdf; border-top:none; border-bottom-color:#f2f2f2; box-shadow:0 1px 1px #ececec; padding:25px 38px 42px 38px; border-radius:0 0 6px 6px;}
.sso_block{ width:450px; border-top:none; border-bottom-color:#f2f2f2; box-shadow:0 1px 1px #ececec; padding:25px 38px 42px 38px; border-radius:0 0 6px 6px;margin: 0 auto;}
新增
register.css的15行
.sso_block_regist{width: 450px;border: none;box-shadow: none;}

###7.字体颜色

超图软件用户服务协议

register.css的4行
.register_blue{ color:#3498db;}
.register_blue{ color:#0081E2;}

###3.跳转问题

####1.注册跳转问题

跳转是默认往邮箱页面跳转
web.xml

sso的登录往注册跳:
top_common.jsp的22行
<a href="register"><spring:message code="Top_Common_Register"/></a>
<a href="phoneregister"><spring:message code="Top_Common_Register"/></a>
暂时

online主站(待解决)

####2.默认用手机登录

jsp
casLoginView.jsp的24-31行
调换顺序,及默认用手机:原因:
lastLoginType =='PHONE_TYPE' ? '' : 'login_active'
一开始没赋值,所以为false
<li id="orPhone" class="login_orPhone ${lastLoginType =='PHONE_TYPE' ? '' : 'login_active'}">
    <span><img src="img/login/phone_login.png"/></span>
    <spring:message code="CasLoginView_Login_OrPhone"/>
</li>
<li id="orEmail" class="login_orEmail ${lastLoginType =='PHONE_TYPE' ? 'login_active' : ''}">
    <span><img src="img/login/email_login.png"/></span>
    <spring:message code="CasLoginView_Login_OrEmail"/>
</li>
RemeberLoginTypeAction.java
UsernamePasswordCredential.java的41行
private ICloudUserType loginType = ICloudUserType.EMAIL_TYPE;(原来是邮箱)
private ICloudUserType loginType = ICloudUserType.PHONE_TYPE;

loginWindow.css
.login_orEmail {padding-right:10px; border-right:1px solid #242424;}
.login_orEmail {padding-left:10px; border-left:1px solid #242424;}

##三.校验

###1.前端校验

####1.姓名

js
1.	register.js的229-232行
// 姓名blur事件
$('#realName').blur(function() {
	iSuperMap.Users.nickNameController($(this));
});

2.	users.js的617-634行
消除左右空格,判断空值和错误,检测,
/*
 * 姓名输入控制器 $realName:姓名input框对象
 *
 */
iSuperMap.Users.realNameController = function($realName) {
    var realName = $realName.val();
    realName = $.trim(realName);
    $realName.val(realName);
    var tip, correct;
    if (realName !== "" && !$realName.hasClass(iSuperMap.Users.CSS.WRONGInput)) {
        tip = iSuperMap.Users.checkRealName(realName);
        if (tip !== "OK") {
            $realName.attr("content", realName).val(tip);
        }
        correct = tip === "OK" ? true : false;
        iSuperMap.Users.inputStyleController($realName, correct);
    }
};

3.users.js的635-658行
/*
*
* 验证姓名是否合法 realName:姓名值 return: 合法:OK,不合法:错误提示
*/
iSuperMap.Users.checkRealName = function(realName) {
    var realNameLength = iSuperMap.Common.countStringByte(realName);
    if (!iSuperMap.REGEXP.RN.test(realName)) {
        return iSuperMap.Lang.CasTip.WRONG_REALNAME_PATTERN;
    } else if (realNameLength < 4 || realNameLength > 30) {
        return iSuperMap.Lang.CasTip.WRONG_NICKNAME_LENGTH;
    }
    // 暂时禁用blur时提示是否存在20150411
    /*
     * else{ var status;
     * iSuperMap.Register.checkNickNameExist(nickName).done(function(data){
     * switch(data.status){ case "success": status="OK"; break; case "fail":
     * status=iSuperMap.Lang.CasTip.EXIST_NICKNAME); break; case "error":
     * status=iSuperMap.Lang.CasTip.ERROR_CONNECT); } }).fail(function(){
     * status=iSuperMap.Lang.CasTip.ERROR_CONNECT); }); return status; }
     */
    else {
        return "OK";
    }
};

4.
casUI.js
casUI_zh.js
casUI_en.js
WRONG_REALNAME_PATTERN : '不可含除英文、汉字、数字以外字符',
WRONG_REALNAME_LENGTH : '请设置长度为4至30位(汉字占两位)',
    
5.global.js的32行
//姓名格式(英文字母、数字、汉字)
RN: /^[a-zA-Z0-9\u4E00-\u9FA5]+$/,

####2.单位名

js
1.	register.js的233-236行
// 单位名blur事件
$('#company').blur(function() {
iSuperMap.Users.nickNameController($(this));
});

2.	users.js的659-676行
/*
 * 单位名输入控制器 $company:单位名input框对象
 *
 */
iSuperMap.Users.companyController = function($company) {
    var company = $company.val();
    company = $.trim(company);
    $company.val(company);
    var tip, correct;
    if (company !== "" && !$company.hasClass(iSuperMap.Users.CSS.WRONGInput)) {
        tip = iSuperMap.Users.checkCompany(company);
        if (tip !== "OK") {
            $company.attr("content", company).val(tip);
        }
        correct = tip === "OK" ? true : false;
        iSuperMap.Users.inputStyleController($company, correct);
    }
};

3.	users.js的677-691行
/*
*
* 验证单位名是否合法 company:单位名值 return: 合法:OK,不合法:错误提示
*/
iSuperMap.Users.checkCompany = function(company) {
    var companyLength = iSuperMap.Common.countStringByte(company);
    if (!iSuperMap.REGEXP.RN.test(company)) {
        return iSuperMap.Lang.CasTip.WRONG_COMPANY_PATTERN;
    } else if (companyLength < 4 || companyLength > 100) {
        return iSuperMap.Lang.CasTip.WRONG_COMPANY_LENGTH;
    }
    else {
        return "OK";
    }
};

4.
casUI.js
casUI_zh.js
casUI_en.js
WRONG_COMPANY_PATTERN : '不可含除英文、汉字、数字、下划线以外字符',
WRONG_COMPANY_LENGTH : '请设置长度为4至100位(汉字占两位)',
    
5.global.js的32行
//单位名格式(英文字母、数字、汉字和下划线)
CP: /^[a-z\w\u4E00-\u9FA5]+$/

###2.后端校验

1.PhoneRegistrationValidator.java

java
//对新增的realName,company和email进行常规验证
		if (!ValidatorUtils.validateRealName(reg.getRealName(), errors,
				"realName")) {
			return;
		}

		if (!ValidatorUtils.validateCompany(reg.getCompany(), errors,
				"company")) {
			return;
		}

		if (!ValidatorUtils.validateEmail(reg.getEmail(), errors,
				"email")) {
			return;
		}

####2.ValidatorUtils

java
public static boolean validateNickname(String nickname, Errors errors, String fieldName){
        // 验证nickname是否为空
        if(nickname.isEmpty()){
            errors.rejectValue(fieldName, "required.nickname");
            return false;
        }
        // 检查是否含有非法字符
        if(!CASCommonUtils.checkSQLInject(nickname)){
            errors.rejectValue(fieldName, "illegal.character");
            return false;
        }
        // 检查nickname格式
        if(!CASCommonUtils.checkParameterFormat(nickname)){
            errors.rejectValue(fieldName, "invalid.nickname");
            return false;
        }
        return true;
    }

    public static boolean validateRealName(String realName, Errors errors, String fieldName){
        // 验证realName是否为空
        if(realName.isEmpty()){
            errors.rejectValue(fieldName, "required.realName");
            return false;
        }
        // 检查是否含有非法字符
        if(!CASCommonUtils.checkSQLInject(realName)){
            errors.rejectValue(fieldName, "illegal.character");
            return false;
        }
        // 检查realName格式
        if(!CASCommonUtils.checkParameter(realName)){
            errors.rejectValue(fieldName, "invalid.realName");
            return false;
        }
        return true;
    }

    public static boolean validateCompany(String company, Errors errors, String fieldName){
        // 验证company是否为空
        if(company.isEmpty()){
            errors.rejectValue(fieldName, "required.company");
            return false;
        }
        // 检查是否含有非法字符
        if(!CASCommonUtils.checkSQLInject(company)){
            errors.rejectValue(fieldName, "illegal.character");
            return false;
        }
        // 检查company格式
        if(!CASCommonUtils.checkParameterFormat(company)){
            errors.rejectValue(fieldName, "invalid.company");
            return false;
        }
        return true;
    }

3.CASCommonUtils.java(提取)

java
/**
	 * 格式检查,匹配数字、英文、中文和下划线的组合
	 * 
	 * @param arg0
	 * @return true:格式匹配 false:格式不匹配
	 */
	public static boolean checkParameterFormat(String arg0,String fieldName) {
		String nicknameRegex = "^[a-z\\w\\u4E00-\\u9FA5]+$";
		String realNamestrRegex = "^[a-zA-Z0-9\\u4E00-\\u9FA5]+$";
		String companystrRegex = nicknameRegex;
		if("nickname".equals(fieldName)){
			return matchParameter(arg0,nicknameRegex);
		}
		if("realName".equals(fieldName)){
			return matchParameter(arg0,realNamestrRegex);
		}
		if("company".equals(fieldName)){
			return matchParameter(arg0,companystrRegex);
		}
		return false;
	}

	private static boolean matchParameter(String arg0,String strRegex){
		Pattern filter = Pattern.compile(strRegex);
		Matcher match = filter.matcher(arg0);
		return match.matches();
	}

####3.CASCommonUtils.java

java

	/**
	 * 格式检查,匹配数字、英文、中文的组合
	 *
	 * @param arg0
	 * @return true:格式匹配 false:格式不匹配
	 */
	public static boolean checkParameter(String arg0) {
		String strRegex = "^[a-zA-Z0-9\\u4E00-\\u9FA5]+$";
		Pattern filter = Pattern.compile(strRegex);
		Matcher match = filter.matcher(arg0);
		return match.matches();
	}

####4.userservice.java

/**
     * 验证姓名
     * @param value
     * @return
     */
    public MessageCode validateRealName(String value) {
        MessageCode messageCode = null;
        int length = CASCommonUtils.calculateStringLength(value);
        if (length < 4 || length > 30) {
            LOGGER.info("validateRealName length error:"+value+" length:"+length);
            messageCode = MessageCode.USERSERVICE_VALIDATEREALNAME_ILLEGALLENGTH;
        }else if (!CASCommonUtils.checkParameter(value)) {
            try {
                String str = new String(value.getBytes("iso-8859-1"), "utf-8");
                LOGGER.info("USERSERVICE_VALIDATEREALNAME_ILLEGAL: "+value+" zhuanhuan: "+str);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            messageCode = MessageCode.USERSERVICE_VALIDATEREALNAME_ILLEGAL;
        }
        return messageCode;
    }

    /**
     * 验证单位名称
     * @param value
     * @return
     */
    public MessageCode validateCompany(String value) {
        MessageCode messageCode = null;
        int length = CASCommonUtils.calculateStringLength(value);
        if (length < 4 || length > 100) {
            LOGGER.info("validateCompany length error:"+value+" length:"+length);
            messageCode = MessageCode.USERSERVICE_VALIDATECOMPANY_ILLEGALLENGTH;
        }else if (!CASCommonUtils.checkParameterFormat(value)) {
            try {
                String str = new String(value.getBytes("iso-8859-1"), "utf-8");
                LOGGER.info("USERSERVICE_VALIDATEREALNAME_ILLEGAL: "+value+" zhuanhuan: "+str);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            messageCode = MessageCode.USERSERVICE_VALIDATECOMPANY_ILLEGAL;
        }
        return messageCode;
    }

5.MessageCode.java

java
	USERSERVICE_VALIDATEREALNAME_ILLEGALLENGTH, // 姓名长度不符合规范
	USERSERVICE_VALIDATEREALNAME_ILLEGAL, // 姓名不符合规则
	USERSERVICE_VALIDATECOMPANY_ILLEGALLENGTH, // 单位名长度不符合规范
	USERSERVICE_VALIDATECOMPANY_ILLEGAL, // 单位名不符合规则
69 CasRegistererView_Form_EmailTip=您的邮箱
71 CasRegistererView_Form_NicknameTip=中英文、数字或下划线组成,不区分大小写
73 CasRegistererView_Form_passwordTip=长度为6-30位,不含空格
78-82行
CasRegistererView_Form_RealName=姓名
CasRegistererView_Form_RealNameTip=您的姓名
CasRegistererView_Form_Company=单位名
CasRegistererView_Form_CompanyTip=您的单位名
CasRegistererView_Form_VerifyCodeTip=请输入验证码

四、修改

前端
1.	设计样式
2.	英文界面样式
3.	中英字体
4.	改制表符
5.	主站跳转
后端
userService 邮箱 ||
校验catch