java 拦截器写法 签名拦截器 SignInterceptor IP白名单

该代码实现了一个名为SignInterceptor的处理器拦截器,主要用于对HTTP请求进行签名验证和IP白名单检查。首先,它检查请求的IP是否在白名单内,然后对请求参数进行签名验证。如果IP不在白名单或签名验证失败,请求将被重定向到错误处理页面。签名验证过程中,请求参数按升序排序后与预设密钥结合计算MD5值,与请求中的签名进行比较。
摘要由CSDN通过智能技术生成

public class SignInterceptor implements HandlerInterceptor {
    private static final Logger LOG = LoggerFactory.getLogger(SignInterceptor.class);
    private final static String WATCH_WHITE = Config.getGlobal().getValue("watch_white");//eg:*
    private final static String WATCH_SERVER_KEY = Config.getGlobal().getValue("watch_server_key");//eg:4731906e3d744891a52357240c8c

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 白名单校验
        String reqIp = request.getRemoteHost();
        if (!ipCheck(reqIp)) {
            request.setAttribute("errorMsg", "IP不在白名单内!");
            response.sendRedirect(request.getContextPath() + "/watch/error.action");
            return false;
        }
        // 签名验证
        Map<String, String[]> map = request.getParameterMap();
        if (!signCheck(map)) {
            request.getSession().setAttribute("errorMsg", "签名验证失败!");
            response.sendRedirect(request.getContextPath() + "/watch/error.action");
            return false;
        }
        return true;
    }

    @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 {

    }

    private boolean signCheck(Map<String, String[]> content) {
        if (!content.containsKey("sign")) {
            return false;
        }
        String sign = content.get("sign")[0];
        if (!content.containsKey("reqTime")) {
            return false;
        }
        StringBuffer result = new StringBuffer();
        Map<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
            public int compare(String obj1, String obj2) {// 升序排序
                return obj1.compareTo(obj2);
            }
        });
        for (String key : content.keySet()) {// 复制并排序,值为空或者会空串,不参与排序
            String[] value = content.get(key);
            if ("sign".equals(key) || null == content.get(key))
                continue;
            map.put(key, value[0]);
        }
        for (String key : map.keySet()) {// 输出到StringBuffer
            result.append(key).append("=").append(map.get(key)).append("&");
        }
        String str = result.substring(0, result.length() - 1) + "&key=" + WATCH_SERVER_KEY;
        try {
            String checkSign = MD5Util.getMD5Code(new String(str.getBytes("utf-8"))).toUpperCase();
            LOG.info("远端签名:{},本地签名:{}", sign, checkSign);
            return sign.equals(checkSign);
        } catch (UnsupportedEncodingException e) {
            System.out.println(e.getMessage());
        }
        return false;
    }

    private boolean ipCheck(String reqIp) {
        LOG.info("请求的IP地址:{}", reqIp);
        if (WATCH_WHITE.equals("*")) {
            return true;
        }
        if (WATCH_WHITE.contains(reqIp)) {
            return true;
        }
        return false;
    }
}

package com.doctor.manage.interceptor;

import java.io.UnsupportedEncodingException;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.doctor.common.util.MD5Util;
import com.doctor.manage.Config;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长青风

赏一块,发大财!赏两块,惹人爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值