• 【Servlet】基于Jsp的微信Oauth2认证


    作者:yongh701

    挂载到微信服务器上的应用程序,能够通过微信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之后,想怎么玩爱怎么玩。

  • 相关阅读:
    EF中读取随机数据的问题
    【坐在马桶上看算法】算法3:最常用的排序——快速排序
    C#递归算法
    机器学习策略(二)---误差分析、训练集与开发测试集不相配怎么办、迁移学习/多任务学习、端到端深度学习
    机器学习策略(一)---正交化、评估指标、优化指标、训练与测试集数据集大小、可避免误差
    改善深层神经网络的优化算法:mini-batch梯度下降、指数加权平均、动量梯度下降、RMSprop、Adam优化、学习率衰减
    具有单隐藏层的二分类神经网络
    神经网络前向后向传播(理论与实战)
    梯度消失与梯度爆炸---如何选择随机初始权重
    正则化输入
  • 原文地址:https://www.cnblogs.com/lxl57610/p/9329642.html
Copyright © 2020-2023  润新知