原創(chuàng)性聲明:本文完全為筆者原創(chuàng),,請尊重筆者勞動力,。轉(zhuǎn)載務(wù)必注明原文地址。
今天忽然想開發(fā)一個公眾號,。 不過啟用開發(fā)者模式之前,,在微信公眾平臺里要進行一些基本的配置。
Paste_Image.png
故而,要先實現(xiàn)公眾號后臺與微信后臺對接的驗證功能,。如何實現(xiàn)這個功能呢?那就是在自己的公眾號后臺提供一個servlet服務(wù),,當點擊上圖中的“提交“按鈕時,微信后臺會發(fā)送一個驗證信息到上圖中“URL”對應(yīng)的地址,,驗證通過才能開啟開發(fā)者模式。
那么自己要提供的servlet服務(wù)要做些什么呢,?微信公眾號開發(fā)者文檔中有詳細介紹,這里就不予多說,。此文主要是講Spring boot。
我在創(chuàng)建普通的web項目時,,覺得麻煩,還要部署tomcat,,于是就想直接用已有的一個spring boot空項目。但是發(fā)現(xiàn),,一直以來處理請求用的都是controller,,對于大部分應(yīng)用場景而言,controller也的確是夠用了,。但是,此時我需要一個servlet處理微信后臺驗證,,這個還真沒弄過。于是,,查資料解決了這個問題,,現(xiàn)做個筆記。
如何在spring boot項目中注冊Servlet呢,?
由于沒有web.xml,無法直接在xml中配置,,但是spring boot提供了另外兩種更為簡潔的方式:
一. java代碼實現(xiàn)servlet注冊
1.創(chuàng)建servlet類,。(一貫作風,,直接上code,,簡單粗暴有效)
public class WeChatServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
PrintWriter out = resp.getWriter();
if (ValidUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
}
}
一個簡單的,,繼承了HttpServlet的類,。
2.在主類中注冊
@SpringBootApplication
public class MyAppliction extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplicaitioni.class);
}
// 注冊servlet
@Bean
public ServletRegistrationBean weChatValid(){
//第一個參數(shù)是第1步中創(chuàng)建的WeChatServlet實例,,第二個參數(shù)是其對應(yīng)的路徑,,相當于web.xml中配置時的url-pattern。
return new ServletRegistrationBean(new WeChatServlet(), "/weChatValid");
}
}
多個了weChatValid 函數(shù)(注意要用@Bean注解),,其中,返回ServletRegistrationBean 的實例,其中兩個參數(shù)....(自己看代碼中注釋^0^),。
完畢。
二,、注解實現(xiàn)Servlet注冊
1.創(chuàng)建Servlet類,,并添加注解,。
//注解實現(xiàn)
@WebServlet(urlPatterns = "/weChatValid", description = "微信接口驗證")
public class WeChatServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
PrintWriter out = resp.getWriter();
if (ValidUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
}
}
類前多了個@WebServlet 注解,參數(shù)urlParttern 和descriptiion 不言而喻,。
2.給主類添加一個注解@ServletComponentScan
@ServletComponentScan //添加的注解
@SpringBootApplication
public class MyAppliction extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class);
}
}
多了個@ServletComponentScan 注解,。
完畢,。
此時訪問該Servlet的url就可以是:
http://localhost:8080/weChatValid
Spring boot注解真的是很方便??!寫到這里,Spring boot中注冊Servlet的兩種方法都已經(jīng)介紹完了,。
不過,,微信公眾平臺服務(wù)器配置url可不能填上面這個地址(圖1中的url輸入框),可以用公網(wǎng)映射工具(如ngrok)將本地地址映射到公網(wǎng)上去,,只是替換其中的localhost:8080 。(不過更好的方法還是直接去買個空間,,我就是太窮了買不起才用公網(wǎng)映射臨時提交測試一下)。希望本文對你有所幫助,!
1.舉一反三:spring boot 的Filter注冊、Listener注冊和Servlet注冊如出一轍,。既然Servlet對應(yīng)的注解是@WebServlet ,,那Filter和Listener就是...(你猜),,不過他們?nèi)齻€在主類上都是用@ServletComponentScan (這個有點不按常理出牌~)
2.學(xué)而再思:第一種方法,,如果要再注冊一個Servlet,,那么主類中該怎么搞,?再創(chuàng)建一個方法?太惡心,,不可能。希望底下評論能有答案,。謝謝!
3.打個廣告:如何手動創(chuàng)建一個Spring boot + angularJs應(yīng)用,,可以參見我的另兩篇博文:《從零開始構(gòu)建一個Spring boot + angularJS Web應(yīng)用1》和《從零....balabalabala.....2》
|