实现进入他人分享的指定页面:[带登录权限机制]

专栏简介

💒个人主页

📄专栏目录

                          📖心灵鸡汤📖

于千万人之中,遇见你所遇见的人;于千万之中,时间的无涯荒野里,没有早一步,也不晚一步,刚巧赶上了

          ✍相关博文✍

微信分享开发:准备工作
微信授权登录:移动端


场景分析:点击好友分享的网页,我想在我登录后直接进入好友分享的页面,而不是在我登录成功后进入网站默认的主页面。

思维导图:

一,实现代码

方案一:采用路由拦截的方式,把路由存储到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 IOException 
	 */
	@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.csdn.net/qq_27185879/article/details/86591513
			 */
			//查询用户。具体实现根据自己实际业务修改。
			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;
		}
	}

微信登录省略部分代码查看:微信授权登录:移动端

方案二:前后端分离[前端vue]

在前面思维导图里面,说了两种基于前后端分离的解决方案,第一种解决方案就不说了,是基于方案一的,这种属于不完全的前后端分离。下面我主要讲下基于前后端的第二个解决方案,代码实现其实是比较简单的,就是把方案一中的方法变成接口,returnRout,改成接收参数。

基于vue流程图:

代码实现:

和方案一的逻辑一致,不一样的有以下几点,比较简单,我就不重新贴了:

①,把方法改为接口

②,在方法上加一个参数:returnRout用于接收前端传递过来的url(对url进行Encode编码)

③,返回json格式数据给前端(含returnRout

=========================================》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要喷香水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值