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>
我试了一下,,题主的方法没错,,就是本地访问本地时,不会用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;
}
有什么问题还可以追问,,,,,有帮助请采纳
你这个错误找不到的是哪个页面?如果知道这一点就知道怎么回事了,还有404跟ip能否获取到没关系吧?最有可能的就是请求的页面和原路返回的不是同一个路径,
用req.getContextPath()看一下就知道了,不一致的话如res.sendRedirect(req.getContextPath()+"/login.html")即可。
这个很有可能是配置的问题
一张图片,,三种访问方式
【1】localhost+端口。。。访问,
【2】ip+端口访问
【3】手机上ip+端口访问(手机和电脑连同一个路由器)