【Servlet】基于Jsp的微信Oauth2认证
挂载到微信服务器上的应用程序,能够通过微信Oauth2认证,能够抓取到用户的微信信息,当然,你首先要通过微信的帐号资质审核。
一、基本思想
二、基本过程
1.登陆微信的公众平台(点击打开链接),在左侧的最下方找到开发者中心,记下你的AppID(应用ID),假设是i,与AppSecret(应用密钥),假设是s
在接口权限表中的高级接口,修改OAuth2.0网页授权,写入你挂载本应用的域名,假设是http://a.b.com。
2.在Eclipse中新建一个工程,由于使用到Servlet与Json,所以要在lib文件夹中放入如下两包:
3.在web.xml中写入:
<servlet> <servlet-name>wx_banding</servlet-name> <servlet-class>Oauth.Jumping</servlet-class> </servlet> <servlet-mapping> <servlet-name>wx_banding</servlet-name> <url-pattern>/wx_banding</url-pattern> </servlet-mapping>
指明访问http://a.b.com/wx_bangding将会跳转到处理Servlet
4.在src文件中新建一个包叫Oauth,在这个包下新建一个类叫Jumping.java
Jumping.java下的代码如下:
package Oauth; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; public class Jumping extends HttpServlet{ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendRedirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=i&redirect_uri=http://a.b.com/oauth.jsp&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException { } }
其中所跳转的链接中的appid与域名请替换成你自己的域名,同时oauth.jsp是我们下一步需要处理的页面
这样的作法是为了此验证网址中的appid不要暴露在外
并且用户也不用看到如此长的一串网址。
5.在WebRoot下的文件夹中新建一个oauth.jsp
注意修改好本页面的标题,不然此页会在微信端很难看
里面的<body></body>的代码如下:
<body> <% String code = null; try { code = request.getParameter("code").toString(); } catch (Exception e) { response.sendRedirect("http://a.b.com"); } %> <script type="text/javascript"> window.location.href = "oauthLoading?code=<%=code%>" </script> </body>
这是一段Jsp加Javascript的混合代码
意思是要拿到这次会话的code,如果拿不到,就跳转到我自己的首页http://a.b.com,恶意用户在电脑端访问此页就拿不到微信会话的code,表明此页面专为微信准备的。
window.location.href重定向指明要到oauthLoading这一Servlet中处理。
6.继续在web.xml添加如下代码段:
<servlet> <servlet-name>oauthLoading</servlet-name> <servlet-class>Oauth.Loading</servlet-class> </servlet> <servlet-mapping> <servlet-name>oauthLoading</servlet-name> <url-pattern>/oauthLoading</url-pattern> </servlet-mapping>
指明要到Oauth包中的Loading.java中处理
7.继续在Oauth包中新建一个Loading.java
代码如下:
package Oauth; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.net.*; import com.alibaba.fastjson.*; public class Loading extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, MalformedURLException, IOException { String code = request.getParameter("code"); StringBuilder json = new StringBuilder(); String url = null; BufferedReader in = null; String inputLine = null; String json1 = null; JSONObject jobject = null; //这里的appid与secret换成你自己的secret url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=i&secret=s&code=" + code + "&grant_type=authorization_code"; in = new BufferedReader(new InputStreamReader(new URL(url) .openConnection().getInputStream(), "utf-8")); while ((inputLine = in.readLine()) != null) { json.append(inputLine); } in.close(); json1 = json.toString(); jobject = JSON.parseObject(json1); json = new StringBuilder(); url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + jobject.getString("access_token") + "&openid=" + jobject.getString("openid"); in = new BufferedReader(new InputStreamReader(new URL(url) .openConnection().getInputStream(), "utf-8")); inputLine = null; while ((inputLine = in.readLine()) != null) { json.append(inputLine); } in.close(); json1 = json.toString(); jobject = JSON.parseObject(json1); request.setAttribute("jobject", jobject); try { request.getRequestDispatcher("WEB-INF/welcome.jsp").forward(request, response); } catch (IOException e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException { } }
8.之后在WEB-INF中新建一个非经正常跳转不让看的welcome.jsp,此页面将会得到一个经历两重验证才得到的,包含用户信息的jobject。
welcome.jsp在头声明使用<%@ page import="com.alibaba.fastjson.*"%>
之后在页身使用<%JSONObject jobject=(JSONObject)request.getAttribute("jobject"); %>
拿到这个用户jobject之后,想怎么玩爱怎么玩。