JavaWeb项目限制IP访问
这其实是一个类似IP地址的黑白名单问题,客户端IP地址在黑名单的就禁止访问,不在的就正常访问;
提出这样一个问题,大概就是感觉某些web应用在某些场合下要求一定的安全措施,这也算是安全审计的一种方法,可能是在应用运行过程中检测到某些IP被高访问服务器,或者经过某种手段(如大数据分析)得知,这些IP有可能再恶意攻击,so最简单的方法就是禁止这些IP访问,因此也就提出这样一个问题来了。
有两种方式解决这个问题,第一就是配置tomcat服务器,将非法地址拒绝掉,第二就是再程序中引入黑名单;
第一种方法,简单只需配置几步即可,不过灵活性很差,第二种就需要编码了,但是可操作的自由度大。
Tomcat配置IP访问限制与允许(server.xml)
<Engine name="Catalina" defaultHost="localhost">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="" deny="10.50.200.38,10.50.100.49"/>
注: 拒绝10.50.200.38与10.50.100.49IP地址对Tomcat服务器的访问,其它允许.
其功用类似于 Apache httpd中基于目录的Allow/Deny指令。
属性:className 意义:Java类名;必须是org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve
属性:allow 意义:以逗号分隔的IP地址。这些字符串返回为常规表达式样式,因此,如果录入IP地址,一定要确信把“.”用反斜线(“\”)进行转义,如127.0.0.1
属性:deny 意义:以逗号分隔的IP地址。如allow属性那样,这些字符串由常规表达式组成
如果未指定allow模式,则会拒绝符合deny属性的模式,但允许其他模式。类似地,如果未指定deny模式,则会允许符合allow属性的模式,但会拒绝其他样式。
JavaWeb—过滤器的使用–禁止IP登陆
在实际的应用中,我们会遇到这样的情况,需要对某些Ip进行访问限制,不让非法的Ip访问应用系统。只有合法的Ip才能可以继续访问!
定义一个过滤器,专门用户过滤指定的ip地址禁止或者允许访问
package filter;
/**
* 过滤IP的过滤器
*/
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterIP implements Filter {
protected String fip = "";// 要过滤的IP
protected FilterConfig fcon = null;// 过滤器配置对象
@Override
public void destroy() {
System.out.println("FilterIP 过滤器销毁");
this.fcon = null;
}
/**
* 执行过滤方法
*
* @author admin
* @param request
* 请求对象
* @param response
* 响应对象
* @param chain
* 过滤器对象
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FilterIP 过滤器执行过滤方法");
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
// 得到请求的IP地址 和要过滤的Ip地址进行对比
String ip = request.getRemoteAddr();
if (fip.equals(ip)) {
// 对方就是要过滤的对象 不能访问
String path = "error.jsp";
RequestDispatcher desc = request.getRequestDispatcher(path);
desc.forward(request, response);
} else {
// 不是 就将过滤器加到过滤链
chain.doFilter(request, response);
}
}
@Override//初始化
public void init(FilterConfig config) throws ServletException {
System.out.println("FilterIP 过滤器初始化");
this.fcon = config;
fip = fcon.getInitParameter("fip");
if (fip == null) {
fip = "";
}
System.out.println("要过滤的IP地址为:" + fip);
}
}
配置过滤器的web.xml
<!-- 配置过滤器 尽可能把过滤器配置到web.xml最上面 -->
<filter>
<filter-name>FilterIP</filter-name>
<filter-class>filter.FilterIP</filter-class>
<init-param>
<param-name>FilteredIP</param-name>
<param-value>127.0.0.1</param-value><!-- 要过滤的Ip 127.0.0.1为本地 -->
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterIP</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//获取用户ip
/**
* 获得用户远程地址
*/
public static String getRemoteAddr(HttpServletRequest request){
String remoteAddr = request.getHeader("X-Real-IP");
if (isNotBlank(remoteAddr)) {
remoteAddr = request.getHeader("X-Forwarded-For");
}else if (isNotBlank(remoteAddr)) {
remoteAddr = request.getHeader("Proxy-Client-IP");
}else if (isNotBlank(remoteAddr)) {
remoteAddr = request.getHeader("WL-Proxy-Client-IP");
}
return remoteAddr != null ? remoteAddr : request.getRemoteAddr();
}