发表于: 2017-10-27 21:49:41

1 694


一.今日完成

1.在容联官网,根据接入短信服务指南,下载发送模板短信接口,集成到项目中

(1)短信验证Java接口

public class CCPRestSDK {

private static final int Request_Get = 0;
private static final int Request_Post = 1;
private static final String TemplateSMS = "SMS/TemplateSMS";
private String SERVER_IP;
private String SERVER_PORT;
private String ACCOUNT_SID;
private String ACCOUNT_TOKEN;
public String App_ID;
private BodyType BODY_TYPE = BodyType.Type_JSON;

public enum BodyType {
Type_XML, Type_JSON;
}


/**
   * 初始化服务地址和端口
   *
   * @param serverIP
   *            必选参数 服务器地址
   * @param serverPort
   *            必选参数 服务器端口
   */
  public void init(String serverIP, String serverPort) {
if (isEmpty(serverIP) || isEmpty(serverPort)) {
LoggerUtil.fatal("初始化异常:serverIP或serverPort为空");
throw new IllegalArgumentException("必选参数:" + (isEmpty(serverIP) ? " 服务器地址 " : "") + (isEmpty(serverPort) ? " 服务器端口 " : "") + "为空");
}
SERVER_IP = serverIP;
SERVER_PORT = serverPort;
}

/**
   * 初始化主帐号信息
   *
   * @param accountSid
   *            必选参数 主帐号名称
   * @param accountToken
   *            必选参数 主帐号令牌
   */
  public void setAccount(String accountSid, String accountToken) {
if (isEmpty(accountSid) || isEmpty(accountToken)) {
LoggerUtil.fatal("初始化异常:accountSid或accountToken为空");
throw new IllegalArgumentException("必选参数:" + (isEmpty(accountSid) ? " 主帐号名称" : "") + (isEmpty(accountToken) ? " 主帐号令牌 " : "") + "为空");
}
ACCOUNT_SID = accountSid;
ACCOUNT_TOKEN = accountToken;
}


/**
   * 初始化应用Id
   *
   * @param appId
   *            必选参数 应用Id
   */
  public void setAppId(String appId) {
if (isEmpty(appId)) {
LoggerUtil.fatal("初始化异常:appId为空");
throw new IllegalArgumentException("必选参数: 应用Id 为空");
}
App_ID = appId;
}

/**
   * 发送短信模板请求
   *
   * @param to
   *            必选参数 短信接收端手机号码集合,用英文逗号分开,每批发送的手机号数量不得超过100个
   * @param templateId
   *            必选参数 模板Id
   * @param datas
   *            可选参数 内容数据,用于替换模板中{序号}
   * @return
   */
  public HashMap<String, Object> sendTemplateSMS(String to, String templateId, String[] datas) {
HashMap<String, Object> validate = accountValidate();
if(validate!=null)
return validate;
if ((isEmpty(to)) || (isEmpty(App_ID)) || (isEmpty(templateId)))
throw new IllegalArgumentException("必选参数:" + (isEmpty(to) ? " 手机号码 " : "") + (isEmpty(templateId) ? " 模板Id " : "") + "为空");
CcopHttpClient chc = new CcopHttpClient();
DefaultHttpClient httpclient = null;
try {
httpclient = chc.registerSSL(SERVER_IP, "TLS", Integer.parseInt(SERVER_PORT), "https");
} catch (Exception e1) {
e1.printStackTrace();
throw new RuntimeException("初始化httpclient异常" + e1.getMessage());
}
String result = "";
try {
HttpPost httppost = (HttpPost) getHttpRequestBase(1, TemplateSMS);
String requsetbody = "";
if (BODY_TYPE == BodyType.Type_JSON) {
JsonObject json = new JsonObject();
json.addProperty("appId", App_ID);
json.addProperty("to", to);
json.addProperty("templateId", templateId);
if (datas != null) {
StringBuilder sb = new StringBuilder("[");
for (String s : datas) {
sb.append("\"" + s + "\"" + ",");
}
sb.replace(sb.length() - 1, sb.length(), "]");
JsonParser parser = new JsonParser();
JsonArray Jarray = parser.parse(sb.toString()).getAsJsonArray();
json.add("datas", Jarray);
}
requsetbody = json.toString();
} else {
StringBuilder sb = new StringBuilder("<?xml version='1.0' encoding='utf-8'?><TemplateSMS>");
sb.append("<appId>").append(App_ID).append("</appId>").append("<to>").append(to).append("</to>").append("<templateId>").append(templateId)
.append("</templateId>");
if (datas != null) {
sb.append("<datas>");
for (String s : datas) {
sb.append("<data>").append(s).append("</data>");
}
sb.append("</datas>");
}
sb.append("</TemplateSMS>").toString();
requsetbody = sb.toString();
}

LoggerUtil.info("sendTemplateSMS Request body =  " + requsetbody);
BasicHttpEntity requestBody = new BasicHttpEntity();
requestBody.setContent(new ByteArrayInputStream(requsetbody.getBytes("UTF-8")));
requestBody.setContentLength(requsetbody.getBytes("UTF-8").length);
httppost.setEntity(requestBody);
HttpResponse response = httpclient.execute(httppost);

HttpEntity entity = response.getEntity();
if (entity != null)
result = EntityUtils.toString(entity, "UTF-8");

EntityUtils.consume(entity);
} catch (IOException e) {
e.printStackTrace();
LoggerUtil.error(e.getMessage());
return getMyError("172001", "网络错误");
} catch (Exception e) {
e.printStackTrace();
LoggerUtil.error(e.getMessage());
return getMyError("172002", "无返回");
} finally {
if (httpclient != null)
httpclient.getConnectionManager().shutdown();
}

LoggerUtil.info("sendTemplateSMS response body = " + result);

try {
if (BODY_TYPE == BodyType.Type_JSON) {
return jsonToMap(result);
} else {
return xmlToMap(result);
}
} catch (Exception e) {

return getMyError("172003", "返回包体错误");
}
}

private HashMap<String, Object> jsonToMap(String result) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
JsonParser parser = new JsonParser();
JsonObject asJsonObject = parser.parse(result).getAsJsonObject();
Set<Entry<String, JsonElement>> entrySet = asJsonObject.entrySet();
HashMap<String, Object> hashMap2 = new HashMap<String, Object>();

for (Entry<String, JsonElement> m : entrySet) {
if ("statusCode".equals(m.getKey()) || "statusMsg".equals(m.getKey()))
hashMap.put(m.getKey(), m.getValue().getAsString());
else {
if ("SubAccount".equals(m.getKey()) || "totalCount".equals(m.getKey())
||"token".equals(m.getKey())||"downUrl".equals(m.getKey())) {
if (!"SubAccount".equals(m.getKey()))
hashMap2.put(m.getKey(), m.getValue().getAsString());
else {
try {
if((m.getValue().toString().trim().length()<=2)&&!m.getValue().toString().contains("[")){
hashMap2.put(m.getKey(), m.getValue().getAsString());
hashMap.put("data", hashMap2);
break;
}
if(m.getValue().toString().contains("[]")){
hashMap2.put(m.getKey(), new JsonArray());
hashMap.put("data", hashMap2);
continue;
}
JsonArray asJsonArray = parser.parse(m.getValue().toString()).getAsJsonArray();
ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();
for (JsonElement j : asJsonArray) {
Set<Entry<String, JsonElement>> entrySet2 = j.getAsJsonObject().entrySet();
HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
for (Entry<String, JsonElement> m2 : entrySet2) {
hashMap3.put(m2.getKey(), m2.getValue().getAsString());
}
arrayList.add(hashMap3);
}
hashMap2.put("SubAccount", arrayList);
} catch (Exception e) {
JsonObject asJsonObject2 = parser.parse(m.getValue().toString()).getAsJsonObject();
Set<Entry<String, JsonElement>> entrySet2 = asJsonObject2.entrySet();
HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
for (Entry<String, JsonElement> m2 : entrySet2) {
hashMap3.put(m2.getKey(), m2.getValue().getAsString());
}
hashMap2.put(m.getKey(), hashMap3);
hashMap.put("data", hashMap2);
}

}
hashMap.put("data", hashMap2);
} else {

JsonObject asJsonObject2 = parser.parse(m.getValue().toString()).getAsJsonObject();
Set<Entry<String, JsonElement>> entrySet2 = asJsonObject2.entrySet();
HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
for (Entry<String, JsonElement> m2 : entrySet2) {
hashMap3.put(m2.getKey(), m2.getValue().getAsString());
}
if (hashMap3.size() != 0) {
hashMap2.put(m.getKey(), hashMap3);
} else {
hashMap2.put(m.getKey(), m.getValue().getAsString());
}
hashMap.put("data", hashMap2);
}
}
}
return hashMap;
}

/**
   * @description 将xml字符串转换成map
   * @param xml
   * @return Map
   */
  private HashMap<String, Object> xmlToMap(String xml) {
HashMap<String, Object> map = new HashMap<String, Object>();
Document doc = null;
try {
doc = DocumentHelper.parseText(xml); // 将字符串转为XML
        Element rootElt = doc.getRootElement(); // 获取根节点
        HashMap<String, Object> hashMap2 = new HashMap<String, Object>();
for (Iterator i = rootElt.elementIterator(); i.hasNext();) {
Element e = (Element) i.next();
if ("statusCode".equals(e.getName()) || "statusMsg".equals(e.getName()))
map.put(e.getName(), e.getText());
else {
if ("SubAccount".equals(e.getName()) || "totalCount".equals(e.getName())
||"token".equals(e.getName())||"downUrl".equals(e.getName())) {
if (!"SubAccount".equals(e.getName())) {
hashMap2.put(e.getName(), e.getText());
} else {
ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
for (Iterator i2 = e.elementIterator(); i2.hasNext();) {
Element e2 = (Element) i2.next();
hashMap3.put(e2.getName(), e2.getText());
arrayList.add(hashMap3);
}
hashMap2.put("SubAccount", arrayList);
}
map.put("data", hashMap2);
} else {

HashMap<String, Object> hashMap3 = new HashMap<String, Object>();
for (Iterator i2 = e.elementIterator(); i2.hasNext();) {
Element e2 = (Element) i2.next();
// hashMap2.put(e2.getName(),e2.getText());
                    hashMap3.put(e2.getName(), e2.getText());
}
if (hashMap3.size() != 0) {
hashMap2.put(e.getName(), hashMap3);
} else {
hashMap2.put(e.getName(), e.getText());
}
map.put("data", hashMap2);
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
LoggerUtil.error(e.getMessage());
} catch (Exception e) {
LoggerUtil.error(e.getMessage());
e.printStackTrace();
}
return map;
}


private HttpRequestBase getHttpRequestBase(int get, String action) throws NoSuchAlgorithmException, UnsupportedEncodingException {
String timestamp = DateUtil.dateToStr(new Date(), DateUtil.DATE_TIME_NO_SLASH);
EncryptUtil eu = new EncryptUtil();
String sig = "";
String acountName = "";
String acountType = "Accounts";

acountName = ACCOUNT_SID;
sig = ACCOUNT_SID + ACCOUNT_TOKEN + timestamp;
String signature = eu.md5Digest(sig);

String url = getBaseUrl().append("/" + acountType + "/").append(acountName).append("/" + action + "?sig=").append(signature).toString();
LoggerUtil.info(getmethodName(action)+" url = " + url);
HttpRequestBase mHttpRequestBase = null;
if (get == Request_Get)
mHttpRequestBase = new HttpGet(url);
else if (get == Request_Post)
mHttpRequestBase = new HttpPost(url);

setHttpHeader(mHttpRequestBase);
String src = acountName + ":" + timestamp;
String auth = eu.base64Encoder(src);
mHttpRequestBase.setHeader("Authorization", auth);
return mHttpRequestBase;
}



private String getmethodName(String action) {
if(action.equals(TemplateSMS)){
return "sendTemplateSMS";
} else {
return "";
}
}

private void setHttpHeader(AbstractHttpMessage httpMessage) {
if (BODY_TYPE == BodyType.Type_JSON) {
httpMessage.setHeader("Accept", "application/json");
httpMessage.setHeader("Content-Type", "application/json;charset=utf-8");
} else {
httpMessage.setHeader("Accept", "application/xml");
httpMessage.setHeader("Content-Type", "application/xml;charset=utf-8");
}
}

private StringBuffer getBaseUrl() {
StringBuffer sb = new StringBuffer("https://");
sb.append(SERVER_IP).append(":").append(SERVER_PORT);
sb.append("/2013-12-26");
return sb;
}

private boolean isEmpty(String str) {
return (("".equals(str)) || (str == null));
}

private HashMap<String, Object> getMyError(String code, String msg) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("statusCode", code);
hashMap.put("statusMsg", msg);
return hashMap;
}

private HashMap<String,Object> accountValidate() {
if ((isEmpty(SERVER_IP))) {
return getMyError("172004", "IP为空");
}
if ((isEmpty(SERVER_PORT))) {
return getMyError("172005", "端口错误");
}
if ((isEmpty(ACCOUNT_SID))) {
return getMyError("172006", "主帐号为空");
}
if ((isEmpty(ACCOUNT_TOKEN))) {
return getMyError("172007", "主帐号令牌为空");
}
if ((isEmpty(App_ID))) {
return getMyError("172012", "应用ID为空");
}
return null;
}
}
public class SDKTestSendTemplateSMS {
public static void main(String[] args) {
HashMap<String, Object> result = null;
String Phone = "18696181170";
String Code = RandNum.getSix();

public  void sentcode(String phone,String code) {
HashMap<String, Object> result = null;
CCPRestSDK restAPI = new CCPRestSDK();
restAPI.init("app.cloopen.com", "8883");
// 初始化服务器地址和端口,生产环境配置成app.cloopen.com,端口是8883.
       restAPI.setAccount(
"8aaf07085bf11ee1015c076080e90673", "479b966c29d7440ba48e610a3e394c21");
// 初始化主账号名称和主账号令牌,登陆云通讯网站后,可在控制首页中看到开发者主账号ACCOUNT SID和主账号令牌AUTH TOKEN。
       restAPI.setAppId("8aaf07085c09bb1b015c0b20e06d0184");
// 请使用管理控制台中已创建应用的APPID。
       result = restAPI.sendTemplateSMS(phone, "1", new String[]{code, "收到短信模板2"});
System.out.println("SDKTestGetSubAccounts result=" + result);
if ("000000".equals(result.get("statusCode"))) {
//正常返回输出data包体信息(map)
           HashMap<String, Object> data = (HashMap<String, Object>) result.get("data");
Set<String> keySet = data.keySet();
for (String key : keySet) {
Object object = data.get(key);
System.out.println(key + " = " + object);
}
} else {
//异常返回输出错误码和错误信息
           System.out.println("错误码=" + result.get("statusCode") + " 错误信息= " + result.get("statusMsg"));
}
}
}

(2)web层Controller组件调用短信验证工具类

@Controller
public class SMtest {

private static final Log log = LogFactory.getLog(SMtest.class);

SDKTestSendTemplateSMS sms = new SDKTestSendTemplateSMS();

@RequestMapping(value = "/a/login",method = RequestMethod.GET)
public String login(){
return "code";
}


@RequestMapping(value = "/a/setcode", method = RequestMethod.GET)
public String  getCode(HttpServletRequest request, HttpServletResponse response, String phone) throws Exception {

log.info("============>phone" + phone);
String code = RandNum.getSix();
log.info("===========>code"+code);
sms.sentcode(phone,code);

response.setContentType("text/html;charset=UTF-8");
//使用request对象的getSession()获取session,如果session不存在则创建一个
       HttpSession session = request.getSession();
//将数据存储到session中
       session.setAttribute("code", code);

return "code";
}

}

2.整理spring mvc框架的流程

(1)在web.xml中配置DispatcherServlet,截获特定的URL请求

<!--业务层与持久层的Spring配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!--声明DispatcherServlet-->
<servlet>
<servlet-name>smart</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<!--名为DispatcherServlet匹配的URL模式-->
<servlet-mapping>
<servlet-name>smart</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

DispatcherServlet的功能是装配好一套可用的默认组件

 <context:component-scan base-package="com.smart.web"/>

<!-- 在使用Excel/PDF/XML的视图时,请先把这个视图解析器注释掉,否则产生视图解析问题-->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
         p:order="100" p:viewClass="org.springframework.web.servlet.view.JstlView"
         p:prefix="/WEB-INF/views/" p:suffix=".jsp"/>

<mvc:annotation-driven conversion-service="conversionService"/>

<!--国际化资源  -->
   <bean id="messageSource"
         class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>i18n/messages</value>
<value>i18n/content</value>
</list>
</property>
</bean>

<bean id="conversionService"
         class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.smart.domain.StringToUserConverter"/>
</list>
</property>
</bean>

<bean
           class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
           p:messageConverters-ref="messageConverters">
<property name="webBindingInitializer">
<bean class="com.smart.web.MyBindingInitializer"/>
</property>
</bean>


<util:list id="messageConverters">
<bean
               class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
<bean
               class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />

<bean
               class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/>
<bean
               class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"
               p:marshaller-ref="xmlMarshaller" p:unmarshaller-ref="xmlMarshaller">
</bean>
<bean
               class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</util:list>

<bean id="xmlMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
<property name="streamDriver">
<bean class="com.thoughtworks.xstream.io.xml.StaxDriver"/>
</property>
<property name="annotatedClasses">
<list>
<value>com.smart.domain.User</value>
</list>
</property>
</bean>


<!-- FreeMarker基础设施及视图解析器配置 -->
   <bean
           class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"
           p:templateLoaderPath="/WEB-INF/ftl" p:defaultEncoding="UTF-8">
<property name="freemarkerSettings">
<props>
<prop key="classic_compatible">true</prop>
</props>
</property>
</bean>

<bean
           class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"
           p:order="5" p:suffix=".ftl" p:contentType="text/html; charset=utf-8"/>

<!-- Excel及PDF视图解析器配置 -->
   <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"
         p:order="10"/>
<bean id="userListExcel" class="com.smart.web.UserListExcelView"/>
<bean id="userListPdf" class="com.smart.web.UserListPdfView"/>

<!-- XMl及JSON视图解析器配置 -->
   <bean id="userListJson"
         class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"
         p:modelKeys="userList"/>

<bean id="userListXml"
         class="org.springframework.web.servlet.view.xml.MarshallingView"
         p:modelKey="userList" p:marshaller-ref="xmlMarshaller"/>

<!-- XML文件或国际化资源文件定义视图 -->
   <bean class="org.springframework.web.servlet.view.XmlViewResolver"
         p:order="20" p:location="/WEB-INF/views/smart-views.xml"/>

<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"
         p:order="30" p:basename="/i18n/views"/>

<bean id="contentNegotiationManager"
         class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"
         p:ignoreAcceptHeader="true"
         p:favorPathExtension="false"
         p:favorParameter="true"
         p:parameterName="format"
         p:defaultContentType="text/html">
<property name="mediaTypes">
<value>
html=text/html
xml=application/xml
json=application/json
</value>
</property>
</bean>
<!-- 协商多种视图解析器 -->
   <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="0">
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"
                     p:modelKeys="userList"/>
<bean class="org.springframework.web.servlet.view.xml.MarshallingView"
                     p:modelKey="userList" p:marshaller-ref="xmlMarshaller"/>
</list>
</property>
</bean>

<!-- 本地化解析 -->
   <bean id="localeResolver"
         class="org.springframework.web.servlet.i18n.CookieLocaleResolver"
         p:cookieName="clientLanguage"
         p:cookieMaxAge="100000"
         p:cookiePath="/"
         p:defaultLocale="zh_CN"/>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>

<!-- 文件上传 -->
   <bean id="multipartResolver"
         class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
         p:defaultEncoding="UTF-8"
         p:maxUploadSize="5000000"
         p:uploadTempDir="file://d:/temp"/>


<!-- 静态资源映射-->
   <mvc:default-servlet-handler/>
<bean id="rpe" class="com.smart.web.ResourcePathExposer"
         init-method="init"/>
<mvc:resources mapping="#{rpe.resourceRoot}/**"
                  location="/" cache-period="31536000"/>

</beans>

(2)编写处理请求的控制器;

(3)编写视图对象,常使用JSP;

(4)配置Spring MVC的业务层的配置文件,使控制器,视图解析器生效.

<context:component-scan base-package="com.smart">
<context:exclude-filter type="aspectj" expression="com.smart..web.*"/>
</context:component-scan>

<websocket:handlers>
<websocket:mapping  handler="helloHandler" path="/hello"/>
</websocket:handlers>

<bean id="helloHandler" class="com.smart.web.MyWebSocketHandler"/>


二.明日计划

继续准备小课堂.整理memcached相关知识点.


三.遇到问题

即使在导入第三方API所需要的jar后,IDEA也会经常提醒缺少相关依赖.


四.收获

以上.





返回列表 返回列表
评论

    分享到