Java如何只允许固定内网IP请求

在Java中,可以通过IP过滤来限制只允许固定的内网IP地址进行请求。本文将介绍如何使用Java代码实现这个功能。

1. 获取请求IP地址

在Java中,可以通过HttpServletRequest对象获取请求的IP地址。首先,需要在Controller方法参数中添加HttpServletRequest对象,然后调用getRemoteAddr()方法获取IP地址。

@Controller
public class MyController {

    @RequestMapping("/test")
    public String test(HttpServletRequest request) {
        String ipAddress = request.getRemoteAddr();
        // 其他逻辑处理
        return "success";
    }

}

2. 配置内网IP地址过滤器

为了只允许固定的内网IP地址进行请求,我们可以使用过滤器来进行IP地址过滤。首先,创建一个实现javax.servlet.Filter接口的过滤器类。

public class IPFilter implements Filter {

    private List<String> allowedIPs;

    @Override
    public void init(FilterConfig filterConfig) {
        allowedIPs = Arrays.asList("192.168.1.100", "192.168.1.101");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String ipAddress = request.getRemoteAddr();
        if (allowedIPs.contains(ipAddress)) {
            chain.doFilter(request, response);
        } else {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
        }
    }

    @Override
    public void destroy() {
        // 清理资源
    }
}

在上述代码中,我们在init()方法中初始化了一个允许的IP地址列表。然后,在doFilter()方法中,我们获取请求的IP地址,如果该IP地址在允许的IP地址列表中,就继续执行过滤链,否则返回一个HTTP 403 Forbidden错误。

3. 配置过滤器

要使用过滤器,需要在web.xml文件中进行配置。假设我们的过滤器类的全限定名为com.example.IPFilter,我们可以在web.xml文件中添加以下配置:

<filter>
    <filter-name>IPFilter</filter-name>
    <filter-class>com.example.IPFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>IPFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

在上述配置中,我们将过滤器映射到了所有的URL,这样所有的请求都会经过过滤器进行IP地址过滤。

4. 完整示例

下面是一个完整的示例,展示了如何使用过滤器来只允许固定内网IP地址进行请求:

@Controller
public class MyController {

    @RequestMapping("/test")
    public String test(HttpServletRequest request) {
        String ipAddress = request.getRemoteAddr();
        // 其他逻辑处理
        return "success";
    }

}

public class IPFilter implements Filter {

    private List<String> allowedIPs;

    @Override
    public void init(FilterConfig filterConfig) {
        allowedIPs = Arrays.asList("192.168.1.100", "192.168.1.101");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String ipAddress = request.getRemoteAddr();
        if (allowedIPs.contains(ipAddress)) {
            chain.doFilter(request, response);
        } else {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
        }
    }

    @Override
    public void destroy() {
        // 清理资源
    }
}
<filter>
    <filter-name>IPFilter</filter-name>
    <filter-class>com.example.IPFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>IPFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

甘特图

gantt
    dateFormat  YYYY-MM-DD
    title Java内网IP请求过滤甘特图

    section 配置
    配置过滤器           :done,    des1, 2022-12-01, 1d
    配置过滤器映射       :done,    des2, after des1, 1d
    
    section 代码实现
    获取请求IP地址       :done,    des