作者: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之后,想怎么玩爱怎么玩。

【Servlet】基于Jsp的微信Oauth2认证的更多相关文章

  1. asp.net 、C#实现微信企业号OAuth2认证

    以微信企业号作为入口的应用,几乎都会遇到需要应用系统中个人信息和微信用户关联问题.从而进行其他业务处理.目前所做项目采取在企业号通讯录添加自定义字段存入应用系统用户信息表中唯一标识UserGuid进行 ...

  2. Spring Cloud下基于OAUTH2认证授权的实现

    GitHub(spring -boot 2.0.0):https://github.com/bigben0123/uaa-zuul 示例(spring -boot 2.0.0): https://gi ...

  3. 基于SPA的网页授权流程(微信OAuth2)

    先说传统MVC网站的网页授权流程. 1.用户发起了某个需要登录执行的操作 2.收集AppId等信息重定向到微信服务器 3.微信服务器回调到网站某个Controller的Action 4.在此Actio ...

  4. 基于jsp+servlet图书管理系统之后台万能模板

    前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...

  5. 基于jsp+servlet图书管理系统之后台用户信息删除操作

    上一篇的博客写的是修改操作,且附有源码和数据库,这篇博客写的是删除操作,附有从头至尾写的代码(详细的注释)和数据库! 此次删除操作的源码和数据库:http://download.csdn.net/de ...

  6. 基于JSP+SERVLET的新闻发布系统(一)

    本系统使用的是基于JSP+SERVLET+TOMCAT6 数据库使用的是MYSQL IDE是MYECLIPSE8.5,页面编辑使用的是百度的ueditor,比较适合咱国人 采用MVC模式,使用的关键技 ...

  7. 基于Servlet、JSP、JDBC、MySQL的一个简单的用户注冊模块(附完整源代码)

    近期看老罗视频,做了一个简单的用户注冊系统.用户通过网页(JSP)输入用户名.真名和password,Servlet接收后通过JDBC将信息保存到MySQL中.尽管是个简单的不能再简单的东西,但麻雀虽 ...

  8. 基于jsp+servlet图书管理系统之后台用户信息插入操作

    前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...

  9. 基于JSP+Servlet开发手机销售购物商城系统(前台+后台)源码

    基于JSP+Servlet开发手机销售购物商城系统(前台+后台) 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MySQL数据库 运行效果图: ...

随机推荐

  1. linux解压xz文件

    本来要下一个 tar.gz 文件的,但是下了一个 xz的,以为不能用了,但是万能的百度.. 解决方法: 首先打包成tar文件 xz -d demo.tar.xz j接着用 tar -xvf demo. ...

  2. JAVA如何实现中式排名和美式排名

    根据公司需求,需要编写中式和美式排名算法,根据具体业务编写的,代码如下,看不懂留言,欢迎探讨,求高手指教更高效稳定的方法.private static int[] datas = {9,9,10,10 ...

  3. 【Go】开发中遇到的坑——持续更新

    关于CGo多语言编译 问题出现在将openCV封装到go语言的时候.在编译时需要设置 CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o xxx mai ...

  4. 【题解】Luogu P5283 [十二省联考2019]异或粽子

    原题传送门 看见一段的异或和不难想到要做异或前缀和\(s\) 我们便将问题转化成:给定\(n\)个数,求异或值最靠前的\(k\)对之和 我们珂以建一个可持久化01trie,这样我们就珂以求出每个值\( ...

  5. Java核心技术梳理-IO

    一.引言 IO(输入/输出),输入是指允许程序读取外部数据(包括来自磁盘.光盘等存储设备的数据).用户输入数据.输出是指允许程序记录运行状态,将程序数据输出到磁盘.光盘等存储设备中. IO的主要内容包 ...

  6. Oracle学习笔记(四)

    Oracle中的体系结构: oracle体系结构中的进程: 共享池相关的优化: drop table t purge; create table t as select * from dba_obje ...

  7. ASP.NET WebApi 学习与实践系列(2)---WebApi 路由请求的理解

    目录 写在前面 WebApi Get 请求 1.无参数的请求 2.一个参数的请求 3.多个参数的请求 4.实体参数的请求 WebApi Post 请求 1.键值对请求 2.dynamic 动态类型请求 ...

  8. 1005 继续(3n+1)猜想(C#)

    一.题目内容: 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n= ...

  9. MySQLNonTransientConnectionException: Could not create connection to database server.

    MySQLNonTransientConnectionException: Could not create connection to database server. Spring整合mybati ...

  10. Django 信号使用问题

    Django 信号使用问题: 在使用django内置信号修改新注册的用户密码的时候,发现内置信号没有被触发.百度&官方文档找到了答案 1.信号的函数应该放在哪里? 这段代码应该放在哪里? 严格 ...