微信开发 PC搭建服务器 开发 微信公众号【Java版本】

(1): 注册一个花生壳 ,并且配好 路由器 外网映射 80 端口 【微信只能接受 80端口 】


(2):编写一个 Servlet  响应  微信响应的URL  【Token的要与代码的Token一致】


package com.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;
import net.sf.json.xml.XMLSerializer;

public class WeixinServlet extends HttpServlet {

	private Logger log = Logger.getLogger(this.getClass().getName());
	private static final long serialVersionUID = 1L;
	private String Token;
	private String echostr;

	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		connect(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		message(request, response);
	}

	/** 
	 *@author haibing.xiao 
	 *@return   
	 *@exception  
	 *@param 
	 *  
	 * <p>接入连接生效验证</p> 
	 */
	private void connect(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		log.info("RemoteAddr: " + request.getRemoteAddr());
		log.info("QueryString: " + request.getQueryString());
		if (!accessing(request, response)) {
			log.info("服务器接入失败.......");
			return;
		}
		String echostr = getEchostr();
		if (echostr != null && !"".equals(echostr)) {
			log.info("服务器接入生效..........");
			PrintWriter out = response.getWriter();
			out.print(echostr);//完成相互认证  
		}
	}

	/** 
	 * @author haibing.xiao 
	 * Date 2013-05-29 
	 * @return boolean 
	 * @exception ServletException, IOException 
	 * @param 
	 * 
	 *<p>用来接收微信公众平台的验证</p>  
	 */
	private boolean accessing(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		String echostr = request.getParameter("echostr");
		if (isEmpty(signature)) {
			return false;
		}
		if (isEmpty(timestamp)) {
			return false;
		}
		if (isEmpty(nonce)) {
			return false;
		}
		if (isEmpty(echostr)) {
			return false;
		}
		String[] ArrTmp = { Token, timestamp, nonce };
		Arrays.sort(ArrTmp);
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < ArrTmp.length; i++) {
			sb.append(ArrTmp[i]);
		}
		String pwd = Encrypt(sb.toString());

		log.info("signature:" + signature + "timestamp:" + timestamp + "nonce:"
				+ nonce + "pwd:" + pwd + "echostr:" + echostr);

		if (trim(pwd).equals(trim(signature))) {
			log.info("响应token");
			this.echostr = echostr;
			return true;
		} else {
			return false;
		}
	}

	private String Encrypt(String strSrc) {
		MessageDigest md = null;
		String strDes = null;

		byte[] bt = strSrc.getBytes();
		try {
			md = MessageDigest.getInstance("SHA-1");
			md.update(bt);
			strDes = bytes2Hex(md.digest()); //to HexString  
		} catch (NoSuchAlgorithmException e) {
			System.out.println("Invalid algorithm.");
			return null;
		}
		return strDes;
	}

	public String bytes2Hex(byte[] bts) {
		String des = "";
		String tmp = null;
		for (int i = 0; i < bts.length; i++) {
			tmp = (Integer.toHexString(bts[i] & 0xFF));
			if (tmp.length() == 1) {
				des += "0";
			}
			des += tmp;
		}
		return des;
	}

	public String getEchostr() {
		return echostr;
	}

	/** 
	 *@author haibing.xiao 
	 *@return   
	 *@exception ServletException, IOException 
	 *@param 
	 *  
	 * <p>XML组装组件</p> 
	 */
	private void message(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		InputStream is = request.getInputStream();
		// 取HTTP请求流长度  
		int size = request.getContentLength();
		// 用于缓存每次读取的数据  
		byte[] buffer = new byte[size];
		// 用于存放结果的数组  
		byte[] xmldataByte = new byte[size];
		int count = 0;
		int rbyte = 0;
		// 循环读取  
		while (count < size) {
			// 每次实际读取长度存于rbyte中  
			rbyte = is.read(buffer);
			for (int i = 0; i < rbyte; i++) {
				xmldataByte[count + i] = buffer[i];
			}
			count += rbyte;
		}
		is.close();
		String requestStr = new String(xmldataByte, "UTF-8");
		System.out.println("requestStr" + requestStr);

		try {
			manageMessage(requestStr, request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/** 
	 * @author haibing.xiao 
	 * @return  
	 * @exception ServletException, IOException 
	 * @param 
	 *  
	 * <p>业务转发组件</p> 
	 *  
	 */
	private void manageMessage(String requestStr, HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		String responseStr;

		try {
			System.out.println("---------------------------");
			XMLSerializer xmlSerializer = new XMLSerializer();
			JSONObject jsonObject = (JSONObject) xmlSerializer.read(requestStr);

			String msgtype = jsonObject.getString("MsgType");

			System.out.println("---------------------------");
			System.out.println("msgtype" + msgtype);

			responseStr = creatRevertText(jsonObject);//创建XML  
			log.info("responseStr:" + responseStr);
			OutputStream os = response.getOutputStream();
			os.write(responseStr.getBytes("UTF-8"));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private String creatRevertText(JSONObject jsonObject) {
		StringBuffer revert = new StringBuffer();
		revert.append("<xml>");
		revert.append("<ToUserName><![CDATA[" + jsonObject.get("FromUserName")
				+ "]]></ToUserName>");
		revert.append("<FromUserName><![CDATA[" + jsonObject.get("ToUserName")
				+ "]]></FromUserName>");
		revert.append("<CreateTime>" + jsonObject.get("CreateTime")
				+ "</CreateTime>");
		revert.append("<MsgType><![CDATA[text]]></MsgType>");
		revert.append("<Content><![CDATA[" + jsonObject.get("Content")
				+ "]]></Content>");
		revert.append("<FuncFlag>0</FuncFlag>");
		revert.append("</xml>");
		return revert.toString();
	}

	@Override
	public void init() throws ServletException {
		Token = "test123";
	}

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

	private String trim(String str) {
		return null != str ? str.trim() : str;
	}

}




<think>好的,我需要帮用户调整职业发展策略,因为他现在不太想继续研究船舶避障和激光雷达SLAM,更想往数据库和前后端开发方向拓展,目标是进入国企。首先,我要理解他的背景:大连海事大学控制科学与工程研一,本科自动化,党员,优秀毕业生,有项目经验,包括基于边缘计算的环境监测船和即将做的垃圾识别船(负责激光雷达避障)。现在他希望转向数据库和前后端,并进入国家电网、烟草、中远海运、中国船舶等国企。 首先,我需要分析国企中哪些岗位适合数据库和前后端方向。国家电网可能需要数据处理、能源管理系统开发;烟草公司可能有生产线自动化、数据监控系统;中远海运和中国船舶可能需要物流管理系统、船舶信息化平台。这些方向都需要数据库和前后端技能。 接下来,考虑如何将用户现有的项目经验与数据库、前后端结合。例如,环境监测船项目涉及DTU上传数据到云服务器,通过后端接口和小程序展示,这已经体现了后端开发和数据处理能力。可以进一步优化数据库设计,引入大数据处理或实时数据分析,提升项目的技术深度。 然后,技能提升方面,需要建议学习更高级的数据库技术(如分布式数据库、时序数据库)、后端框架(如Spring Boot、Django)、前端框架(如Vue、React),以及云原生技术(Docker、Kubernetes),这些在国企的信息化部门有需求。 求职准备方面,需要调整之前的建议,强调信息化、数字化转型相关的岗位,关注国企的IT部门或科技子公司。同时,考取相关认证,比如Oracle认证、阿里云认证,可能会加分。 实习方面,建议寻找国企的IT实习岗位,或者参与与数据处理相关的项目,积累实际经验。同时,可以参与开源项目或自己做一些全栈项目,展示技术能力。 最后,时间规划需要调整,将重点放在数据库和前后端的学习、项目深化、实习申请上。同时,保持与导师沟通,看是否有相关课题可参与,或者将现有项目往数据处理方向扩展。 需要确保建议具体可行,符合国企招聘要求,同时帮助用户突出党员和项目经验的优势,弥补技术转向后的技能衔接。可能还需要提醒用户,国企对技术的需求可能更偏向稳定和实用性,因此项目要注重实际应用和成果展示。</think>根据你的兴趣调整方向,以下是为数据库与前后端开发定制的国企求职提升方案,重点突出数据中台建设和工业信息化系统开发能力: --- ### **一、技术栈升级策略(聚焦国企信息化需求)** 1. **数据库深度优化** - **工业时序数据库**:掌握TDengine/DolphinDB(国家电网设备监测常用),在现有环境监测项目中改造: ```sql -- 创建TDengine超级表模板 CREATE STABLE sensors_data (ts TIMESTAMP, temperature FLOAT, ph FLOAT) TAGS (device_id NCHAR(50), location NCHAR(20)) ``` - **空间数据处理**:学习PostGIS扩展,为垃圾识别船增加地理围栏功能(如自动标记污染水域坐标) 2. **后端架构转型** - **微服务改造**:用Spring Cloud Alibaba重构现有单体架构(契合中远海运微服务技术栈) ```java @RestController @RequestMapping("/api/vessel") public class DataController { @DubboReference private SensorService sensorService; // 使用Dubbo RPC调用 } ``` - **高并发处理**:在云服务器部署Redis集群,实现传感器数据缓冲队列(解决DTU突发流量问题) 3. **前端可视化进阶** - **工业级大屏**:使用Apache ECharts搭建三维港口监控视图(参考青岛港智能调度系统) ```javascript option = { geo3D: { map: 'china', shading: 'realistic', environment: new echarts.graphic.LinearGradient(...) } } ``` - **移动端优化**:研究微信小程序性能调优方案(如分包加载、WebAssembly加速算法) --- ### **二、项目改造方向(提升国企适配度)** | 原项目 | 改造方案 | 国企场景对应 | |----------------------|---------------------------------------------|---------------------------------------| | 环境监测船数据库 | 增加设备预测性维护模块(LSTM时序预测) | 国家电网变压器寿命预测 | | 小程序可视化 | 开发PC端数据驾驶舱(Vue3 + Element Plus) | 中远海运船舶调度监控中心 | | 激光雷达原始数据 | 构建点云数据库(MongoDB+GeoJSON索引) | 中国船舶三维造船模型管理 | | 云服务器架构 | 迁移至国产化平台(华为云GaussDB + OpenEuler) | 符合国企信创要求 | --- ### **三、国企岗位精准匹配** 1. **国家电网** - **目标岗位**:电力物联网应用开发工程师 - **技能准备**: - 学习IEC 61850标准与MMS协议 - 开发电能质量监测API(参考OpenDSS开源项目) 2. **中远海运** - **目标岗位**:港航大数据平台开发工程师 - **技能准备**: - 研究AIS数据清洗算法(处理百万级船舶轨迹数据) - 实现ETA预测微服务(XGBoost+Flask) 3. **中国烟草** - **目标岗位**:生产信息化系统工程师 - **技能准备**: - 搭建卷烟机OEE分析看板(InfluxDB+Grafana) - 开发原烟库存调度系统(遗传算法优化) --- ### **四、竞争力强化组合包** 1. **证书矩阵** - 必考:Oracle OCP(数据库权威认证)、软考系统架构设计师 - 选考:华为HCIP-Big Data(匹配国企云转型需求) 2. **开源贡献** - 参与Apache IoTDB贡献(国家电网参与孵化的时序数据库) - 在Gitee发布船舶数据中台解决方案(获得官方开源证书) 3. **竞赛增值** - 参加中国工业互联网安全大赛(展示系统防御能力) - 冲击“中国软件杯”企业命题组(如中船重工出的船舶调度算法赛题) --- ### **五、求职渠道特别攻略** 1. **隐藏岗位挖掘** - 在启信宝查询目标国企的**软件子公司**(如国网信通产业集团、中远海运科技) - 关注国资委“科改示范企业”名录(如中国船舶第七一六研究所) 2. **笔试题库突破** - 国企编程题常考题型: ```python # 高频考点:处理船舶AIS报文 def parse_ais(nmea_str): # 示例:解析!AIVDM格式数据 parts = nmea_str.split(',') return { 'mmsi': parts[5], 'lon': float(parts[9])/600000 } ``` 3. **面试话术设计** - **项目亮点陈述**: “我在环境监测船项目中设计的分布式缓存策略,使高并发场景下的数据丢失率从3%降至0.2%,这个方案可复用于电网智能电表数据采集” - **职业规划应答**: “希望结合控制学科背景与IT技能,参与国企工业互联网平台建设,例如将船舶控制系统的PID参数优化与大数据分析结合” --- ### **六、三个月速成计划** **第一阶段(1-30天)** - 完成TDengine官方认证课程(TDengine University) - 将现有项目改造成Spring Cloud微服务架构 - 在Gitee建立个人技术博客(每周更新2篇国企技术适配笔记) **第二阶段(31-60天)** - 开发烟草生产溯源系统Demo(Spring Boot+Vue3+RFID模拟) - 通过拉勾猎聘投递10家国企子公司日常实习 - 参加1次中国DevOps社区技术沙龙(拓展人脉) **第三阶段(61-90天)** - 考取Oracle OCP 1Z0-083证书 - 在GitHub建立千星仓库(如ship-data-middleware) - 申请软件著作权(基于改造后的监测系统) --- **紧急行动项**: 立即做三件事—— 1. 在TDengine官网下载企业版(学生免费),重构现有数据库结构 2. 加入Apache IoTDB微信交流群(关注公众号"Apache IoTDB") 3. 预约学校高性能计算中心,申请GPU资源训练时序预测模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值