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   Ds   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: 下面追加了一张图片,,,题主看看,,有问题可以追问,,没有题了,给个采纳(●'◡'●)
3 个月之前 回复
QQ736238785
QQ736238785 回复小鼠标丶: 我也试过多个ip,只有127.0.0.1这个ip能进入小黑屋,其他ip都是延时。要想过滤多个ip怎么办呢?怎么把本地地访问方式改一下?
3 个月之前 回复
Small_Mouse0
Small_Mouse0 回复小鼠标丶: 【补充】晚上没事用嗅探工具试了一下,,localhost:8080/test【TCP/IP Connect: 0ms】试了好多次都是0,,,192.168.31.168:8080/test访问时【TCP/IP Connect: 2ms】结论已经有了,,localhost访问时比较特殊。
3 个月之前 回复
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
3 个月之前 回复
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   Ds   Rxr 2017.09.04 18:59

【追加】

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

图片说明

Csdn user default icon
上传中...
上传图片
插入图片