springboot通过注解实现拦截器的效果

需求:每一个请求都需要签名认证,即在外部请求的过程中需要在URI末尾?后加上key=value形式的参数Query Param

Query Param : timestamp,nonce_str,sign(timestamp:时间戳;noce_str:随机字符串;sign:appid&timestamp&nonce_str&appsecret通过sha256加密获得字符串)

例:https://生产环境/test?timestamp=nonce_str=sign=

@Documented
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireSignature {
}
@Component
public class ExternalServiceInterceptor extends HandlerInterceptorAdapter {

    private Logger logger = LoggerFactory.getLogger(getClass());

    private static final String appid = "1646464644654646";

    private static final String appsecret = "ajgddqndqkdqbdqn";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Method method = ((HandlerMethod) handler).getMethod();
        if (AnnotatedElementUtils.isAnnotated(method, RequireSignature.class)) {
            long now = System.currentTimeMillis();
            String timestamp = request.getParameter("timestamp");
            Long timestampGain = Long.parseLong(timestamp);
            if (Math.abs(now - timestampGain) > 3_000_000) {
                logger.error("签名时间[" + timestampGain + "]已经过期,请重试!");
                throw new BadRequestException("签名已经过期,请重试!");
            }
            String nonce_str = request.getParameter("nonce_str");
            String signGain = request.getParameter("sign");
            if (nonce_str.isEmpty() || signGain.isEmpty()) {
                logger.error("签名不存在,请稍后重试!");
                throw new BadRequestException("签名不存在,请稍后重试!");
            }
            String sign = DigestUtils.sha256Hex(appid + "&"+ timestamp + "&" + nonce_str + "&" + appsecret).toLowerCase();
            if (!signGain.equals(sign)) {
                logger.error("签名sign [ " + signGain + " ] 错误!");
                throw new BadRequestException("签名sign [ " + signGain + " ] 错误!");
            }
        }
        return super.preHandle(request, response, handler);
    }
}

在需要签名验证的请求接口上加上@RequireSignature注解即可

@RequireSignature
    @RequestMapping(value = "test",method = RequestMethod.GET)
    public JSONObject getKey(){
        return testService.getKey();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 引言 秋高气爽,天气转凉,正是学习工作做的好时候。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~ 我是个phper最近在写微信支付...
    恩就是这个名阅读 8,026评论 2 15
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 久违的新文章发布。。我的锅这篇文章是在写的太长,可以慢慢看一下,伪代码,毕竟简书上面,望大家见谅!!!先看官方文档...
    wyatt_plus阅读 1,656评论 0 2
  • And God said,Let there be light:and there was light. 前端知名...
    王强儿阅读 307评论 0 1
  • 来到台湾要先办一张悠游卡,可以做捷运,买门票,很是方便,在seven,全家等便利店都可以充值和办理。 台北故宫博物...
    陈晓晓candy阅读 240评论 1 4