大家都知道,在Web应用程序中,为了节省网络开销,往往吧多个小的js文件整合成一个大的js文件,吧多个小的css文件整合成一个大的js文件,这样原本N次小文件的请求就可以合并成单次的网络请求。最典型的做这件事情的工具是大名鼎鼎的yui-compressor.
其实在Liferay中,我们为了达到合并css,js的目的,用了不同于yui-compressor的方法,这就是我们的主角 MinifierFilter.
既然是Filter,那么它肯定有filter-mapping,我们轻易的在liferay-web.xml中找到了Filter的定义和Filter的mapping.
- ...
- <filter>
- <filter-name>Minifier Filter</filter-name>
- <filter-class>com.liferay.portal.servlet.filters.minifier.MinifierFilter</filter-class>
- </filter>
- <filter> <filter-name>Minifier Filter - JSP</filter-name> <filter-class>com.liferay.portal.servlet.filters.minifier.MinifierFilter</filter-class> <init-param> <param-name>url-regex-pattern</param-name> <param-value>.+/(aui_lang|barebone|css|everything|main)\.jsp</param-value> </init-param> </filter>
- ...
- <filter-mapping>
- <filter-name>Minifier Filter</filter-name>
- <url-pattern>*.css</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>Minifier Filter</filter-name>
- <url-pattern>*.js</url-pattern>
- </filter-mapping>
- <filter-mapping> <filter-name>Minifier Filter - JSP</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
- ...
所以,我们可以看到,当客户端对Liferay服务器上请求任意css或者javascript资源时候,都会被这个MinifierFilter所过滤,我们现在就来看下庐山真面目。
因为MinifierFilter最终实现了Filter接口,而doFilter方法在父类的父类BaseFilter中定义,这个doFilter仅仅是调用processFilter()方法,
- public void doFilter(
- ServletRequest servletRequest, ServletResponse servletResponse,
- FilterChain filterChain)
- throws IOException, ServletException {
- try {
- HttpServletRequest request = (HttpServletRequest)servletRequest;
- HttpServletResponse response = (HttpServletResponse)servletResponse;
- processFilter(request, response, filterChain);
- }
- catch (IOException ioe) {
- throw ioe;
- }
- catch (ServletException se) {
- throw se;
- }
所以这就是我们的入口:
- protected void processFilter(
- HttpServletRequest request, HttpServletResponse response,
- FilterChain filterChain)
- throws Exception {
- Object minifiedContent = getMinifiedContent(
- request, response, filterChain);
- if (minifiedContent == null) {
- minifiedContent = getMinifiedBundleContent(request, response);
- }
- if (minifiedContent == null) {
- processFilter(MinifierFilter.class, request, response, filterChain);
- }
- else {
- if (minifiedContent instanceof File) {
- ServletResponseUtil.write(response, (File)minifiedContent);
- }
- else if (minifiedContent instanceof String) {
- ServletResponseUtil.write(response, (String)minifiedContent);
- }
- }
- }
首先,它会去执行06-07行的getMinifiedContent()方法,它会调用以下代码:
- protected Object getMinifiedContent(
- HttpServletRequest request, HttpServletResponse response,
- FilterChain filterChain)
- throws Exception {
- ..
- ..
- String minifiedContent = null;
- if (realPath.endsWith(_CSS_EXTENSION)) {
- if (_log.isInfoEnabled()) {
- _log.info("Minifying CSS " + file);
- }
- minifiedContent = minifyCss(request, response, file);
- response.setContentType(ContentTypes.TEXT_CSS);
- FileUtil.write(cacheContentTypeFile, ContentTypes.TEXT_CSS);
- }
- else if (realPath.endsWith(_JAVASCRIPT_EXTENSION)) {
- if (_log.isInfoEnabled()) {
- _log.info("Minifying JavaScript " + file);
- }
- minifiedContent = minifyJavaScript(file);
- response.setContentType(ContentTypes.TEXT_JAVASCRIPT);
- FileUtil.write(cacheContentTypeFile, ContentTypes.TEXT_JAVASCRIPT);
- }
- else if (realPath.endsWith(_JSP_EXTENSION)) {
- if (_log.isInfoEnabled()) {
- _log.info("Minifying JSP " + file);
- }
- StringServletResponse stringResponse = new StringServletResponse(
- response);
- processFilter(
- MinifierFilter.class, request, stringResponse, filterChain);
- CacheResponseUtil.setHeaders(response, stringResponse.getHeaders());
- response.setContentType(stringResponse.getContentType());
- minifiedContent = stringResponse.getString();
- if (minifierType.equals("css")) {
- minifiedContent = minifyCss(
- request, response, realPath, minifiedContent);
- }
- else if (minifierType.equals("js")) {
- minifiedContent = minifyJavaScript(minifiedContent);
- }
- FileUtil.write(
- cacheContentTypeFile, stringResponse.getContentType());
- }
- else {
- return null;
- }
- FileUtil.write(cacheDataFile, minifiedContent);
- return minifiedContent;
- }