实现一个黑名单的功能,将指定来源的ip地址加入到黑名单,后续该ip地址访问服务器全部不予访问。
结构:
代码:
BlackListListener.java
@WebListener("/connect")
public class BlackListListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//获取监听器的servletContext对象
ServletContext servletContext = sce.getServletContext();
//通过blacklist.txt的相对路径,得到其绝对路径
String realPath = servletContext.getRealPath("blacklist.txt");
//通过realPath的真实绝对路径创建一个file对象
File file = new File(realPath);
// BufferedReader由Reader类扩展而来,提供通用的缓冲方式文本读取,
// 其readLine从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
//
// BufferedReader和BufferedWriter为默认带有缓冲的字符输出输入流,
// 因为有缓冲区所以效率比没有缓冲区的高。
//设置bufferedReader对象初值为null
BufferedReader bufferedReader =null;
//创建数组对象objects
ArrayList<String> objects = new ArrayList<>();
try {
//为bufferedReader对象赋值
bufferedReader = new BufferedReader(new FileReader(file));
//bufferedReader对象读取数据
while (bufferedReader.read()!=-1){
//将读取到的数据加入到objects中
objects.add(bufferedReader.readLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//为servletContext中name="blacklist",赋值value=objects
servletContext.setAttribute("blacklist", objects);
}
}
BlackListFilter.java
@WebFilter("/connect")
public class BlackListFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//从servletContext中读取⽂件,request、response
HttpServletRequest request =(HttpServletRequest)req;
HttpServletResponse reponse =(HttpServletResponse)resp;
//将从request中读取的数据设置为utf-8编码
request.setCharacterEncoding("utf-8");
//告知浏览器和服务器编码为utf-8
reponse.setContentType("text/html;charset=utf-8");
//获取servletContext
ServletContext servletContext = req.getServletContext();
//获取黑名单blacklist数组并创建blackList对象
List<String> blacklist = (List<String>) servletContext.getAttribute("blacklist");
//从request请求中获取ip
String ip=getIpAddress((HttpServletRequest) req);
System.out.println("请求ip:"+ip);
//如果存在,则拦截
for (String s : blacklist) {
if (ip.equals(s)){
System.out.println("ip为"+ip+"为黑名单ip");
servletContext.setAttribute("blackip",ip);
reponse.setHeader("refresh", "2;url=" + request.getContextPath() + "/infog");
return;
}
}
servletContext.setAttribute("ip",ip);
//拦截放行操作。
chain.doFilter(req,resp);
}
public void init(FilterConfig config) throws ServletException {
}
public static String getIpAddress(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.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 ||
"unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 ||
"unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
}
ConnectServlet.java
@WebServlet("/connect")
public class ConnectServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过request.getServletContext得到servletContext对象
ServletContext servletContext = request.getServletContext();
//并通过servletContext对象得到blacklist的值
ArrayList<String> blacklist = (ArrayList<String>) servletContext.getAttribute("blacklist");
Object ip = servletContext.getAttribute("ip");
response.getWriter().println("ip:"+ip+"可以访问目标网页");
}
}
SkipServlet.java
@WebServlet("/infog")
public class SkipServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
ServletContext servletContext = request.getServletContext();
String blackip = (String) servletContext.getAttribute("blackip");
response.getWriter().println("你的ip:"+blackip+"已被拉入黑名单");
}
}
结果: