java实现微信小程序服务端(登录)

   要去实现服务端的代码,就要先去了解客户端的请求。

   我们来看下api中的登录功能:

  在注册的时候,这个小程序的appId和appSecret已经知道了,还有固定的url,然后我们可以将其做为配置文件放入后台的代码中去:

  2.根据小程序信息和code获取openId和session_key

  3. 将openId和session_key生成sessionId返回客户端

第三方服务器端拿到请求回来的session_key和openid,先留着,不能给客户端;然后用操作系统提供的真正随机数算法生成一个新的session,叫session_id

· 所以,每次前端wx.login()后调用的服务端的controller我们就应该这样写:

  4. 使用过滤器过滤请求头中含有session_id的请求

  接下来,我们每次请求的时候,都会将session_id放入请求头中去,然后判断在redis中是否有key为该值得键值对,从而判断用户session是否失效

  我们这里使用了过滤器来拦截用户请求

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException,ServletException{
        //设置跨域请求
        HttpServletResponse resp = (HttpServletResponse)response;
        resp.setHeader("Access-Control-Allow-Origin", "*");

        HttpServletRequest req = (HttpServletRequest)request;
        //获取请求时的sessionId
        String sessionId = req.getHeader("sessionId");
        if(StrUtil.IsNullOrEmpty(sessionId)){
            //该请求不需要验证session,直接通过
            log.info("sessionId过滤","该请求不需要过滤,通过");
            chain.doFilter(request,response);
            return;
        }else {
            //只有在缓存中存在该sessionId才能进行请求
            if (!jedisCache.existKey(sessionId)) {
                // 登录信息已过期,请重新登录
                log.info("sessionId过滤", "登录信息失效,请重新登录");
                response.getWriter().write("登录信息失效,请重新登录");
                return;
            }

            log.info("sessionId过滤", "session验证成功");
            chain.doFilter(request, response);
        }
    }

  每当用户注册或者登陆时,请求中都会含有session_id,然后我们将session_id作为key去redis中查找,得到value值,也就是我们之前存的openId,然后我们将openId和用户信息进行数据库表中的关联,之后,我们调用登陆方法的时候,如果该openId有关联的用户信息,则不需要去登录,直接给前端返回用户信息即可,就是我们之前的那段代码:

posted @ 2018-07-13 11:54 阅读(...) 评论(...)

经验分享 程序员 微信小程序 职场和发展