场景分析:点击好友分享的网页,我想在我登录后直接进入好友分享的页面,而不是在我登录成功后进入网站默认的主页面。
思维导图:
编辑
一,实现代码
方案一:采用路由拦截的方式,把路由存储到session里面,在通过登录方法函数进行应用重定向
流程图:
编辑
核心代码:
①,WeixinInterceptor.java(简化了一下,核心业务代码都在,自行修改相关业务即可)
package com.base.aop;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.base.service.common.CommonService;
import com.base.utils.ParamUtils;
import com.shows.dao.PointsDao;
import com.shows.domain.SysUser;
import com.shows.service.MessageService;
import com.shows.service.PointsService;
import com.shows.service.RedUrlSeverice;
public class WeixinInterceptor extends HandlerInterceptorAdapter {
@Resource(name = "commonService")
protected CommonService commonService;
@Resource(name= "messageService")
protected MessageService messageService;
@Resource
private PointsService pointsService;
@Resource
private RedUrlSeverice redUrlSeverice;
@Resource
private PointsDao pointsDao;
private static final Logger logger = LogManager.getLogger(WeixinInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try {
HttpSession session = request.getSession();
response.setCharacterEncoding("UTF-8");
//进入请求查看session 里面 token
HttpServletRequest httpRequest=(HttpServletRequest)request;
String strBackUrl = request.getRequestURL() + "?" + request.getQueryString();
//把url存储到session中
session.setAttribute("returnRout", strBackUrl);
logger.info("returnRout----------------------"+session.getAttribute("returnRout"));
String token = request.getParameter("token");
if(token == null){
token=(String) session.getAttribute("token");
}
if(token != null){
/**
* 这里取出session中的token,然后查询数据库是否存在改用户。具体查询业务根据
* 你自己的业务修改,我这只是给个例子
*/
//查询用户信息根据token
SysUser user = commonService.uniqueByProp(SysUser.class, "wasaiPhoneToken", token);
//微信token
if(user == null){
user = commonService.uniqueByProp(SysUser.class, "wasaiWeixinToken", token);
}
if(user == null){
/**
* 用户为空,重定向到登录页面
*/
response.sendRedirect(ParamUtils.getMessage("appIp","")+"/logintest/phonelogin.mvc");//登陆页面
return false;
}
/**
* 存储用户信息到token
*/
request.setAttribute("token", token);
return true;
}
/**
* token为空跳转到登录页面
*/
//微信浏览器
if(RequestUtils.is_weixn(httpRequest, response)){
response.sendRedirect(WeixinUtil.getAUTHORIZE_URL(ParamUtils.getMessage("appIp","")+"/CommunityLogin/loginByWeixin.mvc","snsapi_userinfo"));
return false;
}
response.sendRedirect(ParamUtils.getMessage("appIp","")+"/logintest/phonelogin.mvc");//登陆页面
return false;
} catch (Exception e) {
logger.error("登录异常-->"+e);
response.sendRedirect(ParamUtils.getMessage("appIp","")+"/logintest/phonelogin.mvc");//登陆页面
return false;
}
}
}
②,LoginController.java(简化了一下,具体业务自行修改,核心实现都在,此处以微信登录为例)
/**
* 微信授权回调(new)
* @param request
* @param response
* @param code
* @return
* @throws
@RequestMapping("/loginByWeixin.mvc")
public String LoginByWeixin(Model model, HttpServletRequest request, HttpServletResponse response, String code) throws IOException{
if(code==null || "".equals(code.trim())){
response.sendRedirect(ParamUtils.getMessage("appIp","")+"/logintest/phonelogin.mvc");
return null;
}
try {
String token =null;
/**
* 省略业务:
* ①,根据code获取openid和access_token
* ②,根据openid和access_token换取微信用户信息。
* 具体实现方法查看:https://blog.51cto.com/lvyq/5768530
*/
//查询用户。具体实现根据自己实际业务修改。
SysUser user = commonService.uniqueByProp(SysUser.class, "wasaiWeixinToken", token);
if(user == null){
/**
* 存储用户信息业务操作,较简单,已省略
*/
}
session.setAttribute("token", token);
logger.info("微信renturnRout=="+(String) session.getAttribute("returnRout"));
String returnRout = (String)session.getAttribute("returnRout");
response.sendRedirect(returnRout);
return null;
} catch (IOException e) {
e.printStackTrace();
logger.error(e);
response.sendRedirect(ParamUtils.getMessage("appIp","")+"/logintest/phonelogin.mvc");
return null;
}
}
微信登录省略部分代码查看:微信授权登录:移动端[unionid](一)
方案二:前后端分离[前端vue]
在前面思维导图里面,说了两种基于前后端分离的解决方案,第一种解决方案就不说了,是基于方案一的,这种属于不完全的前后端分离。下面我主要讲下基于前后端的第二个解决方案,代码实现其实是比较简单的,就是把方案一中的方法变成接口,returnRout,改成接收参数。
基于vue流程图:
编辑
代码实现:
和方案一的逻辑一致,不一样的有以下几点,比较简单,我就不重新贴了:
①,把方法改为接口
②,在方法上加一个参数:returnRout用于接收前端传递过来的url(对url进行Encode编码)
③,返回json格式数据给前端(含returnRout)
=========================================》