微信登录功能

#5、微信二维码显示

#设置路由id

spring.cloud.gateway.routes[4].id=service-user

#设置路由的uri

spring.cloud.gateway.routes[4].uri=lb://service-user

#设置路由断言,代理servicerId为auth-service的/auth/路径

spring.cloud.gateway.routes[4].predicates= Path=/*/ucenter/**

2.2、前端显示登录二维码


2.2.1、封装api请求

创建/api/user/wexin.js文件

import request from ‘@/utils/request’

const api_name = /api/ucenter/wx

export default {

getLoginParam() {

return request({

url: ${api_name}/getLoginParam,

method: get

})

}

}

2.2.2、修改组件

修改layouts/myheader.vue文件,添加微信二维码登录逻辑

1、引入api

在这里插入图片描述

import weixinApi from ‘@/api/weixin’

2、引入微信js

在这里插入图片描述

mounted() {

// 注册全局登录事件对象

window.loginEvent = new Vue();

// 监听登录事件

loginEvent.$on(‘loginDialogEvent’, function () {

document.getElementById(“loginDialog”).click();

})

// 触发事件,显示登录层:loginEvent.$emit(‘loginDialogEvent’)

//初始化微信js

const script = document.createElement(‘script’)

script.type = ‘text/javascript’

script.src = ‘https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js’

document.body.appendChild(script)

// 微信登录回调处理

let self = this;

window[“loginCallback”] = (name,token, openid) => {

self.loginCallback(name, token, openid);

}

},

3、实例化微信JS对象

添加微信登录方法

在这里插入图片描述

//微信二维码显示

weixinLogin() {

this.dialogAtrr.showLoginType = ‘weixin’

weixinApi.getLoginParam().then(response => {

var obj = new WxLogin({

self_redirect:true,

id: ‘weixinLogin’, // 需要显示的容器id

appid: response.data.appid, // 公众号appid wx*******

scope: response.data.scope, // 网页默认即可

redirect_uri: response.data.redirect_uri, // 授权成功后回调的url

state: response.data.state, // 可设置为简单的随机数加session用来校验

style: ‘black’, // 提供"black"、"white"可选。二维码的样式

href: ‘’ // 外部css文件url,需要https

})

})

},

说明:微信登录方法已绑定weixinLogin(),查看页面

4、测试

刷新页面,查看效果

在这里插入图片描述

在这里插入图片描述

2.3、处理微信回调


2.3.1、引入依赖

在这里插入图片描述

org.apache.httpcomponents

httpclient

4.5.1

2.3.2、添加httpclient工具类

添加com.study.yygh.user.util.HttpClientUtils类

package com.study.yygh.user.utils;

import org.apache.commons.io.IOUtils;

import org.apache.commons.lang.StringUtils;

import org.apache.http.Consts;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.HttpClient;

import org.apache.http.client.config.RequestConfig;

import org.apache.http.client.config.RequestConfig.Builder;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.conn.ConnectTimeoutException;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.conn.ssl.SSLContextBuilder;

import org.apache.http.conn.ssl.TrustStrategy;

import org.apache.http.conn.ssl.X509HostnameVerifier;

import org.apache.http.entity.ContentType;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import org.apache.http.message.BasicNameValuePair;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLException;

import javax.net.ssl.SSLSession;

import javax.net.ssl.SSLSocket;

import java.io.IOException;

import java.net.SocketTimeoutException;

import java.security.GeneralSecurityException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

public class HttpClientUtils {

public static final int connTimeout=10000;

public static final int readTimeout=10000;

public static final String charset=“UTF-8”;

private static HttpClient client = null;

static {

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();

cm.setMaxTotal(128);

cm.setDefaultMaxPerRoute(128);

client = HttpClients.custom().setConnectionManager(cm).build();

}

public static String postParameters(String url, String parameterStr) throws ConnectTimeoutException, SocketTimeoutException, Exception{

return post(url,parameterStr,“application/x-www-form-urlencoded”,charset,connTimeout,readTimeout);

}

public static String postParameters(String url, String parameterStr,String charset, Integer connTimeout, Integer readTimeout) throws ConnectTimeoutException, SocketTimeoutException, Exception{

return post(url,parameterStr,“application/x-www-form-urlencoded”,charset,connTimeout,readTimeout);

}

public static String postParameters(String url, Map<String, String> params) throws ConnectTimeoutException,

SocketTimeoutException, Exception {

return postForm(url, params, null, connTimeout, readTimeout);

}

public static String postParameters(String url, Map<String, String> params, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException,

SocketTimeoutException, Exception {

return postForm(url, params, null, connTimeout, readTimeout);

}

public static String get(String url) throws Exception {

return get(url, charset, null, null);

}

public static String get(String url, String charset) throws Exception {

return get(url, charset, connTimeout, readTimeout);

}

/**

  • 发送一个 Post 请求, 使用指定的字符集编码.

  • @param url

  • @param body RequestBody

  • @param mimeType 例如 application/xml “application/x-www-form-urlencoded” a=1&b=2&c=3

  • @param charset 编码

  • @param connTimeout 建立链接超时时间,毫秒.

  • @param readTimeout 响应超时时间,毫秒.

  • @return ResponseBody, 使用指定的字符集编码.

  • @throws ConnectTimeoutException 建立链接超时异常

  • @throws SocketTimeoutException 响应超时

  • @throws Exception

*/

public static String post(String url, String body, String mimeType,String charset, Integer connTimeout, Integer readTimeout)

throws ConnectTimeoutException, SocketTimeoutException, Exception {

HttpClient client = null;

HttpPost post = new HttpPost(url);

String result = “”;

try {

if (StringUtils.isNotBlank(body)) {

HttpEntity entity = new StringEntity(body, ContentType.create(mimeType, charset));

post.setEntity(entity);

}

// 设置参数

RequestConfig.Builder customReqConf = RequestConfig.custom();

if (connTimeout != null) {

customReqConf.setConnectTimeout(connTimeout);

}

if (readTimeout != null) {

customReqConf.setSocketTimeout(readTimeout);

}

post.setConfig(customReqConf.build());

HttpResponse res;

if (url.startsWith(“https”)) {

// 执行 Https 请求.

client = createSSLInsecureClient();

res = client.execute(post);

} else {

// 执行 Http 请求.

client = HttpClientUtils.client;

res = client.execute(post);

}

result = IOUtils.toString(res.getEntity().getContent(), charset);

} finally {

post.releaseConnection();

if (url.startsWith(“https”) && client != null&& client instanceof CloseableHttpClient) {

((CloseableHttpClient) client).close();

}

}

return result;

}

/**

  • 提交form表单

  • @param url

  • @param params

  • @param connTimeout

  • @param readTimeout

  • @return

  • @throws ConnectTimeoutException

  • @throws SocketTimeoutException

  • @throws Exception

*/

public static String postForm(String url, Map<String, String> params, Map<String, String> headers, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException,

SocketTimeoutException, Exception {

HttpClient client = null;

HttpPost post = new HttpPost(url);

try {

if (params != null && !params.isEmpty()) {

List formParams = new ArrayList();

Set<Entry<String, String>> entrySet = params.entrySet();

for (Entry<String, String> entry : entrySet) {

formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));

}

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, Consts.UTF_8);

post.setEntity(entity);

}

if (headers != null && !headers.isEmpty()) {

for (Entry<String, String> entry : headers.entrySet()) {

post.addHeader(entry.getKey(), entry.getValue());

}

}

// 设置参数

Builder customReqConf = RequestConfig.custom();

if (connTimeout != null) {

customReqConf.setConnectTimeout(connTimeout);

}

if (readTimeout != null) {

customReqConf.setSocketTimeout(readTimeout);

}

post.setConfig(customReqConf.build());

HttpResponse res = null;

if (url.startsWith(“https”)) {

// 执行 Https 请求.

client = createSSLInsecureClient();

res = client.execute(post);

} else {

// 执行 Http 请求.

client = HttpClientUtils.client;

res = client.execute(post);

}

return IOUtils.toString(res.getEntity().getContent(), “UTF-8”);

} finally {

post.releaseConnection();

if (url.startsWith(“https”) && client != null

&& client instanceof CloseableHttpClient) {

((CloseableHttpClient) client).close();

}

}

}

/**

  • 发送一个 GET 请求

*/

public static String get(String url, String charset, Integer connTimeout,Integer readTimeout)

throws ConnectTimeoutException,SocketTimeoutException, Exception {

HttpClient client = null;

HttpGet get = new HttpGet(url);

String result = “”;

try {

// 设置参数

Builder customReqConf = RequestConfig.custom();

if (connTimeout != null) {

customReqConf.setConnectTimeout(connTimeout);

}

if (readTimeout != null) {

customReqConf.setSocketTimeout(readTimeout);

}

get.setConfig(customReqConf.build());

HttpResponse res = null;

if (url.startsWith(“https”)) {

// 执行 Https 请求.

client = createSSLInsecureClient();

res = client.execute(get);

} else {

// 执行 Http 请求.

client = HttpClientUtils.client;

res = client.execute(get);

}

result = IOUtils.toString(res.getEntity().getContent(), charset);

} finally {

get.releaseConnection();

if (url.startsWith(“https”) && client != null && client instanceof CloseableHttpClient) {

((CloseableHttpClient) client).close();

}

}

return result;

}

/**

  • 从 response 里获取 charset

*/

@SuppressWarnings(“unused”)

private static String getCharsetFromResponse(HttpResponse ressponse) {

// Content-Type:text/html; charset=GBK

if (ressponse.getEntity() != null && ressponse.getEntity().getContentType() != null && ressponse.getEntity().getContentType().getValue() != null) {

String contentType = ressponse.getEntity().getContentType().getValue();

if (contentType.contains(“charset=”)) {

return contentType.substring(contentType.indexOf(“charset=”) + 8);

}

}

return null;

}

/**

  • 创建 SSL连接

  • @return

  • @throws GeneralSecurityException

*/

private static CloseableHttpClient createSSLInsecureClient() throws GeneralSecurityException {

try {

SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

public boolean isTrusted(X509Certificate[] chain,String authType) throws CertificateException {

return true;

}

}).build();

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {

@Override

public boolean verify(String arg0, SSLSession arg1) {

return true;

}

@Override

public void verify(String host, SSLSocket ssl)

throws IOException {

}

@Override

public void verify(String host, X509Certificate cert)

throws SSLException {

}

@Override

public void verify(String host, String[] cns,

String[] subjectAlts) throws SSLException {

}

});

return HttpClients.custom().setSSLSocketFactory(sslsf).build();

} catch (GeneralSecurityException e) {

throw e;

}

}

}

2.3.2、添加回调接口获取access_token

在WeixinApiController 类添加回调方法

在这里插入图片描述

//微信扫描后回调的方法
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)


后记


总结一下这三次面试下来我的经验是:

  1. 一定不要死记硬背,要理解原理,否则面试官一深入就会露馅!

  2. 代码能力一定要注重,尤其是很多原理性的代码(之前两次让我写过Node中间件,Promise.all,双向绑定原理,被虐的怀疑人生)!

  3. 尽量从面试官的问题中表现自己知识的深度与广度,让面试官发现你的闪光点!

  4. 多刷面经!

我把所有遇到的面试题都做了一个整理,并且阅读了很多大牛的博客之后写了解析,免费分享给大家,算是一个感恩回馈吧,有需要的朋友【点击我】免费获取。祝大家早日拿到自己心怡的工作!

篇幅有限,仅展示部分内容



阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

[外链图片转存中…(img-1DrUAOWp-1713804902509)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

[外链图片转存中…(img-flsedfhJ-1713804902509)]
后记


总结一下这三次面试下来我的经验是:

  1. 一定不要死记硬背,要理解原理,否则面试官一深入就会露馅!

  2. 代码能力一定要注重,尤其是很多原理性的代码(之前两次让我写过Node中间件,Promise.all,双向绑定原理,被虐的怀疑人生)!

  3. 尽量从面试官的问题中表现自己知识的深度与广度,让面试官发现你的闪光点!

  4. 多刷面经!

我把所有遇到的面试题都做了一个整理,并且阅读了很多大牛的博客之后写了解析,免费分享给大家,算是一个感恩回馈吧,有需要的朋友【点击我】免费获取。祝大家早日拿到自己心怡的工作!

篇幅有限,仅展示部分内容



  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值