在一个javaWeb项目中,配置拦截器是必不可少的,有些操作只有在权限用户登录下才可以进行,那么一个简单的拦截器该如何写呢?首先自定义一个拦截器实现HandlerIntercepto接口,然后获取登录信息,具体是怎样实现的请看下面的代码实现:
/**
* @Description <自定义拦截器/Custom interceptor>
* @Author
* @Date
* @Param
* @since 1.0.0
**/
public class Interceptor implements HandlerInterceptor
{
//↓代码正文↓
/**
* @return boolean
* @Description <preHandle为请求之前调用,Controller请求之前进行调用,false结束请求,true继续请求>
* @Author
* @Date
* @Param [request, response, handler]
* @since 1.0.0
**/
// @Override
// @ResponseBody
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception
{
boolean flag = true;
String message = GlobalConstant.Wrap;
message += "————— 调用接口前 —————" + GlobalConstant.Wrap;
//获取访问信息
String url = request.getServletPath();
String ip = normalUtil.getRealIp(request);
String urlIp="访问接口:" + url + " 访问IP:" + ip;
message += urlIp+GlobalConstant.Wrap;
//非公共接口访问
if (!publicInterface.isPublicInterface(url))
{
//获取登录标签
String login = request.getParameter("userId");
if (login!= null)
{
//判断Redis缓存中是否存在该login值
if(redisUtil.isKeyExists(login))
{
//获取该login值对应的身份信息
HashMap<String,Object> userInfo=userService.getRedisInformation(login);
request.setAttribute("userInfo",userInfo);
//成功访问接口则刷新一次登录缓存信息
userService.putLoginInfo();
logger.info("访问成功!该访问用户为:"+User.getLoginAccount()+" 名字:"+User.getUserName());
}
else
{
//Redis中MD5值超时被刷新
logger.info(urlIp+" login:"+login+" "+CoMessage.访问失败登录超时.getMessage());
normalUtil.returnResponseCodeMessage(response,CoMessage.访问失败登录超时.getCode(),logger);
flag = false;
return flag;
}
} else
{
logger.info(urlIp+" "+CoMessage.访问失败尚未登录.getMessage());
normalUtil.returnResponseMessage(response,Message.访问失败尚未登录.getCode(),logger);
flag = false;
return flag;
}
}
if (flag)
message += "—————开始访问接口—————";
else
message += "—————访问接口失败—————";
//打印访问信息
logger.info(message);
return flag;
}
/**
* @return void
* @Description <postHandle为请求处理之后调用,Controller请求处理之后,但是在视图渲染之前调用>
* @Author
* @Date
* @Param [request, response, handler, modelAndView]
* @since 1.0.0
**/
@Override
public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView) throws Exception
{
String message = GlobalConstant.Wrap + "————— 调用接口中 —————";
logger.info(message);
}
/**
* @return void
* @Description <整个请求结束之后被调用,也就是在Dispatcher Servlet渲染了对应的视图之后>
* @Author
* @Date
* @Param [request, response, handler, ex]
* @since 1.0.0
**/
@Override
public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception
{
String message = GlobalConstant.Wrap + "—————调用接口结束—————";
message += GlobalConstant.Wrap;
logger.info(message);
}
//↓单元测试代码↓
}