因为项目使用是用户登录redis缓存一个token,所以当用户在a设备登录时,便缓存了tokenA,这时用户去b设备登录,新缓存了一个tokenB,如果用户使用a设备去请求,token已经失效,从而实现单一设备登录
1 实现接口HandlerInterceptor
public class MiniInterceptor implements HandlerInterceptor{
/**
* 请求controller之前
true放行,false拦截并返回response
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截请求"+request.getRequestURL());
//验证逻辑
return false;
}
/**
*请求controller成功返回视图之前
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 请求成功,返回视图之后
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
2 配置注入拦截器
@Configuration//标志为配置文件
public class WebMvcConfig extends WebMvcConfigurerAdapter {
把拦截器注册到springmvc中
/**
* 注册miniInterceptor为bean到SpringMvc
*/
@Bean
public MiniInterceptor miniInterceptor(){
return new MiniInterceptor();
}
/**
* 拦截器注册中心 注册到拦截器里面去 实现addInterceptors方法 添加拦截规则
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(miniInterceptor()).addPathPatterns("/user/**");
super.addInterceptors(registry);
}
3 完善业务逻辑 逻辑在拦截器的preHander方法中,
- 把认证信息和业务信息区分开,吧userid和token写在请求头里(可忽略)
String userId = request.getHeader("userId");
String userToken = request.getHeader("userToken");
- 怎么吧拦截信息返回回去
把信息写在preHandle的response中
~~~
returnErrorResponse(response,new JSONResult().errorTokenMsg("登录超时"));
/**
* @author XieLinan
* @create 2018/9/10 0010 16:15
* @desc 将错误信息返回给前端
* @Version: 1.0
*/
public void returnErrorResponse(HttpServletResponse response, JSONResult result) throws IOException {
//设置响应信息的内容格式
response.setContentType("test/json");
//设置响应信息的编码
response.setCharacterEncoding("utf-8");
OutputStream outputStream = null;
//获得响应对象的输入流 把数据写入
try {
response.reset();
outputStream = response.getOutputStream();
byte[] b = JsonUtils.objectToJson(result).getBytes("utf-8");
outputStream.write(b);
outputStream.flush();
}finally {
//关闭流
if(outputStream != null){
outputStream.close();
}
}
}
~~~
有任何问题欢迎指点 qq 1294235127
更多推荐
springboot的拦截器和限制单一用户登录
发布评论