网站的图标是网站的风格和内涵的一种概括,给网站制作一个好的图标是非常重要的。那么,怎么在 JavaWeb 中设置网站图标呢?

首先我们要知道,之所以我们在浏览网页的时候会在标题栏上显示出图标,是因为浏览器会隐式的发送一个 domain:port/favicon.ico 的请求,那么我们只要拦截这个请求然后把我们的图标作为响应发送回去,就可以让浏览器解析我们的图标并且显示了。这里我们可以通过 JavaWeb 中的过滤器来实现,具体实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package cn.iduoka.util;

import org.apache.log4j.Logger;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
* Created on 2016/1/5 17:20.
*/
@WebFilter(filterName = "FaviconFilter", urlPatterns = ("/favicon.ico"))
public class FaviconFilter implements Filter {

Logger logger = Logger.getLogger(FaviconFilter.class);

@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("FaviconFilter is working.");
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
InputStream is = FaviconFilter.class.getClassLoader().getResourceAsStream("/favicon.ico");
byte[] b = new byte[10 * 1024];
is.read(b);
HttpServletResponse response = (HttpServletResponse) servletResponse;
ServletOutputStream sos = response.getOutputStream();
sos.write(b);
sos.flush();
is.close();
sos.close();
}

@Override
public void destroy() {
logger.info("FaviconFilter has been destroyed.");
}

}

我们看到,我们拦截了 /favicon.ico 请求,然后其中的 doFilter 方法就是把我们的图标以流的形式读进来,然后再放在响应中发送给客户端,这样客户端就可以收到我们的图标并解析显示了。