第7章 :视频展示页开发(7-23 拦截器配置与注册 — 7-25 前后端联调测试拦截器)

学习目标:

7-23 拦截器配置与注册
7-24 完善登录拦截并且限制用户只能在一台手机登录
7-25 前后端联调测试拦截器


学习内容:

7-23 拦截器配置与注册

有些用户会用另一种模拟请求工具来请求我们的后端,这时候后端会报错:这时候使用spring boot的拦截器,spring mvc是将拦截器写在xml中的,而spring boot不需要,因为它已经省略了xml的配置,此时将拦截器写在java类中就行。

1、新建MiniInterceptor.java类

第7章 :视频展示页开发(7-23 拦截器配置与注册 — 7-25 前后端联调测试拦截器)_第1张图片
2、此时新建的java文件里面有默认的代码:

package com.asayi.controller.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MiniInterceptor implements HandlerInterceptor {
     

	/**
	 * 拦截请求,在controller调用之前
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
     
		return false;
	}
	
	
    /**
     * 请求controller之后,渲染视图前
     */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
     

	}

	/**
	 * 请求controller之后,视图渲染之后
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
     

	}

}

3、在WebMvcConfig.java中为MiniInterceptor注册一个实例:

	@Bean
	public MiniInterceptor miniInterceptor() {
     
		return new MiniInterceptor();
		
	}

4、还要将这个bean注册到拦截器中:
第7章 :视频展示页开发(7-23 拦截器配置与注册 — 7-25 前后端联调测试拦截器)_第2张图片
第7章 :视频展示页开发(7-23 拦截器配置与注册 — 7-25 前后端联调测试拦截器)_第3张图片
WebMvcConfig.java中代码如下:

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
     
		
		registry.addInterceptor(miniInterceptor()).addPathPatterns("/user/**");//注册拦截器
		super.addInterceptors(registry);
	}

5、调用后端:

第7章 :视频展示页开发(7-23 拦截器配置与注册 — 7-25 前后端联调测试拦截器)_第4张图片

7-24 完善登录拦截并且限制用户只能在一台手机登录

1、在mine.js的用户登录代码段中写上用于安全验证的信息:

第7章 :视频展示页开发(7-23 拦截器配置与注册 — 7-25 前后端联调测试拦截器)_第5张图片
2、到后端获取刚才新加的两条信息:
MiniInterceptor.java的代码如下:

package com.asayi.controller.interceptor;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

//import com.alibaba.druid.util.StringUtils;
import com.asayi.utils.RedisOperator;
import com.asayi.utils.IMoocJSONResult;
import com.asayi.utils.JsonUtils;

import org.apache.commons.lang.StringUtils;


public class MiniInterceptor implements HandlerInterceptor {
     

	@Autowired
	public RedisOperator redis;
	public static final String USER_REDIS_SESSION="user-redis-session";
	
	/**
	 * 拦截请求,在controller调用之前
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
     
		//获取前端传过来的header信息
		String userId=request.getHeader("userId");
		String userToken=request.getHeader("userToken");
		
		if(StringUtils.isNotBlank(userId)&&StringUtils.isNotBlank(userToken)) {
     
			
			String uniqueToken=redis.get(USER_REDIS_SESSION+":"+userId);
			if(StringUtils.isEmpty(userId)&&StringUtils.isBlank(uniqueToken)) {
     
				System.out.println("请登录...");
				returnErrorResponse(response, new IMoocJSONResult().errorTokenMsg("请登录..."));
				return false;
			}else {
     
				if(uniqueToken.equals(userToken)) {
     
					System.out.println("账号异地登录...");
					returnErrorResponse(response, new IMoocJSONResult().errorTokenMsg("账号异地登录..."));
					return false;
				}
			}
		}else {
     
			System.out.println("请登录...");
			returnErrorResponse(response, new IMoocJSONResult().errorTokenMsg("请登录..."));
			return false;
		}
		

		
		/**
		 * 返回false:请求被拦截 ,返回
		 * 返回true:请求ok,可以继续执行,放行
		 */
		return true;
	}
	
	public void returnErrorResponse(HttpServletResponse response, IMoocJSONResult result) 
			throws IOException, UnsupportedEncodingException {
     
		OutputStream out=null;
		try{
     
		    response.setCharacterEncoding("utf-8");
		    response.setContentType("text/json");
		    out = response.getOutputStream();
		    out.write(JsonUtils.objectToJson(result).getBytes("utf-8"));
		    out.flush();
		} finally{
     
		    if(out!=null){
     
		        out.close();
		    }
		}
	}
	
	
    /**
     * 请求controller之后,渲染视图前
     */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
     

	}

	/**
	 * 请求controller之后,视图渲染之后
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
     

	}

}

7-25 前后端联调测试拦截器

1、在小程序端的mine.js的登录代码中添加对502状态的反应:

 onLoad: function () {
     
    var me=this;
    // var user=app.userInfo;//建立全局用户对象
    //fixme 修改原有的全局对象为本地缓存
    var user=app.getGlobalUserInfo();
    var serverUrl=app.serverUrl;
    wx.showLoading({
     
      title: '请等待...',
    });
    wx.request({
     
      url: serverUrl+'/user/query?userId='+user.id,
              method:"POST",
              header:{
     
                  'content-type':'application/json',//默认值
                  'userId':user.id,//用于安全验证的信息
                  'userToken':user.userToken,
              },
              success:function(res){
     
                  console.log(res.data);
                  wx.hideLoading();
                  var status=res.data.status;
                  if(status==200){
     
                    var userInfo=res.data.data;
                    var faceUrl="../resource/images/noneface.png"
                    if(userInfo.faceImage!=null&&userInfo.faceImage!=''&&userInfo.faceImage!=undefined){
     
                      faceUrl=serverUrl+userInfo.faceImage;
                    }

                    me.setData({
     
                      faceUrl:faceUrl,
                      fansCounts:userInfo.fansCounts,
                      followCounts:userInfo.followCounts,
                      receiveLikeCounts:userInfo.receiveLikeCounts,
                      nickname:userInfo.nickname
                    });
                  }else if(status==502){
     
                    wx.showToast({
     
                      title: res.data.msg,
                      duration:3000,
                      icon:"none",
                      success:function(){
     
                        wx.redirectTo({
     
                          url: '../userLogin/login',
                        })
                      }
                    })
                  }
              }
    })

2、在WebMvcConfig.java中添加对/user、/bgm里面所有方法的拦截,对/video/upload、/video/uploadCover的拦截:

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
     
		
		registry.addInterceptor(miniInterceptor()).addPathPatterns("/user/**")
		                                          .addPathPatterns("/bgm/**")
		               .addPathPatterns("/video/upload","/video/uploadCover");//注册拦截器
		super.addInterceptors(registry);
	}

3、按照上面的方法分别在下面三处也加上需要进行502状态判断的代码:
第7章 :视频展示页开发(7-23 拦截器配置与注册 — 7-25 前后端联调测试拦截器)_第6张图片

你可能感兴趣的:(我的小程序搭建之路,java,mysql,redis,spring,boot,小程序)