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 阅读(...) 评论(...)