写微信获取 openid 时候遇到的坑之一-Controller 里直接实例化属性

多次调用同一个 Controller 方法,由于 Spring 的 Controller 是单例的,因此如果我们在 Controller 里面修改了属性值,就会破坏我们的逻辑。

场景:实现【用户管理】【网页授权获取用户基本信息】第二步:通过code 换取网页授权 access_token 。
我在 Controller 里声明了一个引导用户在微信客户端打开的 url 链接:

@Controller
public class WeixinController {

    @Autowired
    private Config config;

    /**
     * 引导用户用微信客户端打开的链接,以获取 code
     */
    private String redirectUrlOpenInWeixin = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";


    // http://192.168.199.121:8080/openid?weixinName=liwei
    @RequestMapping(value="/openid",method=RequestMethod.GET)
    public String getOpenid(String weixinName) throws UnsupportedEncodingException{
        if("liwei".equals(weixinName)){
            System.out.println("获取李威的微信公众号配置");
            System.out.println(config.LIWEI_APPID);
            System.out.println(config.LIWEI_APPSECRET);
            redirectUrlOpenInWeixin = redirectUrlOpenInWeixin.replace("APPID", config.LIWEI_APPID);
            redirectUrlOpenInWeixin = redirectUrlOpenInWeixin.replace("REDIRECT_URI", URLEncoder.encode(config.REDIRECT_URI,"utf-8"));
            // snsapi_userinfo || snsapi_base
            redirectUrlOpenInWeixin = redirectUrlOpenInWeixin.replace("SCOPE", "snsapi_base");
        }
        return "redirect:" + redirectUrlOpenInWeixin;
    }

分析:这样写看起来是没有问题的,但是下面的这行代码

redirectUrlOpenInWeixin = redirectUrlOpenInWeixin.replace("APPID", config.LIWEI_APPID);
            redirectUrlOpenInWeixin = redirectUrlOpenInWeixin.replace("REDIRECT_URI", URLEncoder.encode(config.REDIRECT_URI,"utf-8"));

在第 2 次调用的时候,没有起到作用。因为第 2 次调用的时候 ,url 链接里面已经没有了 APPID 和 REDIRECT_URI 这两个“常量”。好在这是一个常量,多次调用返回的是同一个结果,没有问题!

我们打印一下日志,可以分析到:

第 1 次调用时:

即将被替换的 url https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

第 2 次调用时:

即将被替换的 url https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx021dc52436e8f72c&redirect_uri=http%3A%2F%2Fliwei.tunnel.mobi%2FaccessToken&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

可以看到,由于单利模式的作用,字符串已经被替换,第 2 次调用的时候

redirectUrlOpenInWeixin = redirectUrlOpenInWeixin.replace("APPID", config.LIWEI_APPID);
            redirectUrlOpenInWeixin = redirectUrlOpenInWeixin.replace("REDIRECT_URI", URLEncoder.encode(config.REDIRECT_URI,"utf-8"));

这两行代码事实上已经起不到什么作用了。

总结:
1、寻找 bug 的思路不清晰,只关注结果,但没有仔细分析问题出在哪里。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值