在一个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);
    }

    //↓单元测试代码↓

}