天天看点

IP鉴权IP鉴权

IP鉴权

1、MrpIPIntercepter

package com.huawei.mrp.common.interceptors;

import com.huawei.market.configmgr.ConfigMgr;
import com.huawei.mrp.common.util.other.RequestUtil;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

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

/**
 * 检查后台请求是否从指定IP发出(IP 拦截),使用spring配置
 * @see
 * @see 1.0
 */
public class MrpIPIntercepter extends AbstractInterceptor {
    private static final long serialVersionUID = -L;
    private static final Logger LOGGER = Logger.getLogger(MrpIPIntercepter.class);

    /**
     * 执行从配置项读取的名称
     */
    private String configName;
    /**
     * 返回鉴权不通过报文的格式 json/xml (默认:json)
     */
    private String contentType;

    /**
     * 返回鉴权不通过的报文内容
     */
    private String content;

    @Override
    public String intercept(ActionInvocation inv) throws Exception {
        String configIP = ConfigMgr.getReqServUrl(configName);//xml文件读取
        ActionContext context = inv.getInvocationContext();

        HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
        HttpServletResponse response = (HttpServletResponse) context.get(ServletActionContext.HTTP_RESPONSE);

        // 如果没配置,默认本机可以访问
        if (StringUtils.isBlank(configIP)) {
            configIP = "127.0.0.1";
        }

        // 获取客户端请求IP
        String requestIP = RequestUtil.getIpAddr(request);

        LOGGER.info("configIP=" + configIP + "   requestIP=" + requestIP);

        // 解析配置判断IP
        String[] managerIPs = configIP.split(";");
        for (String ip : managerIPs) {
            if (StringUtils.equals(ip, requestIP)) {
                return inv.invoke();
            }
        }

        LOGGER.info("request IP is not specified IP, request refused!");

        if ("xml".equalsIgnoreCase(contentType)) {
            response.setContentType("text/xml;charset=UTF-8");
        } else {
           response.setContentType("application/json;charset=UTF-8");
        }
        content = StringUtils.trim(content);
        response.getWriter().println(content);
        return Action.NONE;
    }

    public void setConfigName(String configName) {
        this.configName = configName;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    public void setContent(String content) {
        this.content = content;
    }
}
           

2、applicationContext.xml

<!-- MobileArea ip拦截器 -->
    <bean id="caiyunMobileAreaIpInterceptor" class="com.huawei.mrp.common.interceptors.MrpIPIntercepter">
        <property name="configName"><value>caiyunMobileArea_manager_IP</value></property>
        <property name="contentType"><value>json</value></property>
        <property name="content">
            <value>{"code":-1 ,"msg":"You are not privileged, request refused!"}</value>
        </property>
    </bean>
           

3、struts_vaildMobile.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="vaildMobile" extends="struts-default,json-default" namespace="/api">

        <!-- IP鉴权 -->
        <interceptors>
            <interceptor name="caiyunVaildMobileIpInterceptor" class="caiyunVaildMobileIpInterceptor"/>
        </interceptors>

        <action name="marketVaildMobile" class="vaildMobileAction"
            method="marketVaildMobile">
            <interceptor-ref name="caiyunVaildMobileIpInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

    </package>
</struts>