天天看點

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>