2 qq736238785 QQ736238785 于 2017.09.03 14:58 提问

servlet过滤器 过滤黑名单Ip 404错误找不到页面
 public class MainAction implements Filter {

    /**
     * 
     */
     private String charset;
        //黑名单
        private Set<String> set = new HashSet<String>();

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {

            charset = filterConfig.getInitParameter("charset");

            //到数据库中把黑名单加载进来,这里简单模拟一下
            set.add("192.168.31.168");
        }

        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
              request.setCharacterEncoding(charset);
            //以下演示黑名单过滤技术
            String ip = request.getRemoteAddr();;//获得客户端的IP
            if(set.contains(ip)){
                HttpServletResponse resp = (HttpServletResponse) response;
                resp.setContentType("text/html;charset=utf-8");
                resp.getWriter().println("你已被列入黑名单!");
            }else{//放行
                chain.doFilter(request, response);
            }
        }

        @Override
        public void destroy() {
        }


}
 <filter>
    <filter-name>MainAction</filter-name>
    <filter-class>nuc.bl.Servlet.MainAction</filter-class>
    <init-param>
        <param-name>charset</param-name>
        <param-value>utf-8</param-value>    
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>MainAction</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

4个回答

Small_Mouse0
Small_Mouse0   Rxr 2017.09.03 16:10
已采纳

我试了一下,,题主的方法没错,,就是本地访问本地时,不会用IP地址(测出来的,找了半天不知道什么原因。)

解决方法
【1】set.add("192.168.31.168");改成 set.add("127.0.0.1");

【2】request.getRemoteAddr();;//获得客户端的IP,,获取到的id题主可以打印一下,,是“0:0:0:0:0:0:0:1”

需要用下面方法获取,,,
String ip = getRemoteAddress((HttpServletRequest) request);

 /**
     * 获取访问IP
     * @param request
     * @return
     */
    public String getRemoteAddress(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
    }

有什么问题还可以追问,,,,,有帮助请采纳

Small_Mouse0
Small_Mouse0 回复QQ736238785: 下面追加了一张图片,,,题主看看,,有问题可以追问,,没有题了,给个采纳(●'◡'●)
11 个月之前 回复
QQ736238785
QQ736238785 回复小鼠标丶: 我也试过多个ip,只有127.0.0.1这个ip能进入小黑屋,其他ip都是延时。要想过滤多个ip怎么办呢?怎么把本地地访问方式改一下?
11 个月之前 回复
Small_Mouse0
Small_Mouse0 回复小鼠标丶: 【补充】晚上没事用嗅探工具试了一下,,localhost:8080/test【TCP/IP Connect: 0ms】试了好多次都是0,,,192.168.31.168:8080/test访问时【TCP/IP Connect: 2ms】结论已经有了,,localhost访问时比较特殊。
11 个月之前 回复
Small_Mouse0
Small_Mouse0 【补充】,,本地访问方式改一下,是可以通过ip访问的,,,例如【1】localhost:8080/test,,这种方式服务器获取到访问的ip是【0:0:0:0:0:0:0:1】,,【2】192.168.31.168:8080/test,,访问的是同一个地方,但是这种访问方式服务器接收的IP是客户端的IP
11 个月之前 回复
ShewMi
ShewMi   2017.09.03 18:27

你这个错误找不到的是哪个页面?如果知道这一点就知道怎么回事了,还有404跟ip能否获取到没关系吧?最有可能的就是请求的页面和原路返回的不是同一个路径,
用req.getContextPath()看一下就知道了,不一致的话如res.sendRedirect(req.getContextPath()+"/login.html")即可。

qq_39031681
qq_39031681   2017.09.04 10:28

这个很有可能是配置的问题

Small_Mouse0
Small_Mouse0   Rxr 2017.09.04 18:59

【追加】

一张图片,,三种访问方式
【1】localhost+端口。。。访问,
【2】ip+端口访问
【3】手机上ip+端口访问(手机和电脑连同一个路由器)

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
设计一个ip网段黑名单过滤(网易面试题)
问题:给出一个网段,该网段的地址都属于黑名单,验证其他ip地址是否属于黑名单要想到通过二进制的位运算来实现:ip & 子网掩码 = 网段对于一个CIDR的ip地址,怎么得到子网掩码? 可以得到CIDR中的网络号位数netCount,然后:int mask = 0xFFFFFFFF << (32 - netCount);这样就能得到子网掩码public class IPFilter { /**
JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤
实现用户的自动登录: 解决方案: 设置一个全站拦截的过虑器。 在此过虑器中,读取用户带过来的Cookie信息,然后从中读取用户的用户名和密码,自动帮助用户登录。 即可实现自动登录功能。 用Filter验证用户是否已经登录过。已经登录过了,我们就根据他选择的自动登录来选择让他在多久内能自动登录。 IP黑名单过滤就很简单了,只要在Filter过滤器防范一下就OK。 在init方法中,
为Web网站添加IP过滤功能实践总结(C#)
这项任务是从米老师(米新江的博客)那里接手的。目的是给考试系统加上限制,在局域网内,防止同学从考试以外的地点登录。          过滤IP听起来比较容易,最终的效果就是验证一下IP,再决定是否有权限访问考试系统。但是要做的好就不那么容易了。接下来总结一下开发历程。          一、工程根基:数据库设计。          设计工程首先要从需求开始,需求出界面,界面出
具备白名单、黑名单的Filter基类扩展
问题引入:比如定义了一个mapping, <servlet-mapping> <servlet-name>html_dispatcher</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> 就是说所有的.html请求都会由html_dispatcher来处理,但现在的问题是: 我希望
在.NET环境下为网站增加IP过滤功能(方案和c#源码)
华能集团下某发电厂的企业网站(基于Asp.Net2.0实现,不允许修改源程序)要求实现“厂内用户可直接访问整个站点的所有页面,厂外用户只能访问指定的页面”的功能,本文将按照需求分析、方案设计、编码实现、部署应用的顺序逐步阐述整个解决方案的形成过程(附全部c#源码)。
servlet和jsp页面过滤器Filter详解
servlet API中最重要的一个功能就是能够为servlet和JSP页面定义过滤器。过滤器提供了某些早期服务器所支持的非标准“servlet链接”的一种功能强大且标准的替代品。                                                                                                      过滤器是一个
netty的ip过滤
我们经常需要用到ip白名单,ip黑名单。netty本身就帮我实现了一套验证机制,提供了IpFilterRuleHandler类   1 public class IpFilterRuleHandler extends IpFilteringHandlerImpl 1 public
关于servlet中Filter过滤器解决页面乱码问题
标题 ##使用Filter过滤器解决页面乱码servlet中的Filter过滤器是一个挺好的东西,说实话, 前段时间写velocity的时候,输出中文时页面乱码 两种解决方法: 第一个,是在velocity的配置文件写好输入输出编码格式, 第二个,就是我选择的在web配置FiltercharsetFilter.java 首先需要实现Filter接口:public class charset
过滤白名单算法
昨天面试的时候,面试官出了一道算法题,当时头脑有点乱,没有想出来,现在把它写出来 题目:给定几个白名单网段,例如 "172.16.0.0/17", "192.168.0.0/24", "10.10.10.10/9",现在有个请求过来,怎么快速确认请求IP是否在白名单中? package common; import org.junit.Test; public class Wh
Servlet Filter 过滤器 对指定页面不拦截
Servlet Filter 过滤器 对指定页面不拦截