7-23 拦截器配置与注册
7-24 完善登录拦截并且限制用户只能在一台手机登录
7-25 前后端联调测试拦截器
有些用户会用另一种模拟请求工具来请求我们的后端,这时候后端会报错:这时候使用spring boot的拦截器,spring mvc是将拦截器写在xml中的,而spring boot不需要,因为它已经省略了xml的配置,此时将拦截器写在java类中就行。
1、新建MiniInterceptor.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注册到拦截器中:
WebMvcConfig.java中代码如下:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(miniInterceptor()).addPathPatterns("/user/**");//注册拦截器
super.addInterceptors(registry);
}
5、调用后端:
1、在mine.js的用户登录代码段中写上用于安全验证的信息:
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 {
}
}
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);
}