说实在的微信的这个网页授权登录有点坑爹,文档里完全没有说明一些HTTP请求上的设计问题。
如处理继承重写SimpleUrlAuthenticationFailureHandler的时候就很容易发生问题
问题1:设置状态码为401时
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
ResponseUtil.setResponseDto(response, ResponseCode.CODE_401, exception.getMessage());
}
会出现一个坑爹的情况:
微信会给服务器端连续发送三次!这玩意儿坑爹的。上网找了下文章有一个据说很靠谱的解决方案:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=URL&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect
附加下面这个参数
connect_redirect=1
但是!问题依旧。
好吧,那就改代码吧!我返回HTTP200 Body返回错误信息就可以了吧?!
问题2:返回HTTP状态200,更坑爹的来了!
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
response.setStatus(HttpServletResponse.SC_OK);
ResponseUtil.setResponseDto(response, ResponseCode.CODE_401, exception.getMessage());
}
这个时候用户授权登录时会跳转到一个乱七八糟的页面去,一堆HTML代码,一团乱麻。
初步判断:
微信服务器得到200请求后跳转的页面并不是一个标准的HTML时就会拦截到另外一个奇怪的页面去以格式化的方式展现出来。
解决问题:
那行吧!既然401你要发三次给我,200你要给我跳页面,那我自己302重定向来解决问题。
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("location", wxServerConfig.getAuthenticationFailureUrl() + request.getParameter("code"));
}
问题的核心就在返回请求时的HTTP Status Code上面!
这时,微信服务器也不会向我方发送三次重复请求了,并且也没有什么奇奇怪怪的页面拦截展现给用户。