Liferay MinifierFilter的研究

大家都知道,在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);
            }
        }
    }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, filter
, request
, response
, filterchain
, minify
, 合并多个js、css
, Minifier
Compressor
liferay filter、html minifier、javascript minifier、minifier、pyminifier,以便于您获取更多的相关知识。

时间: 2024-12-03 22:32:35

Liferay MinifierFilter的研究的相关文章

Liferay Portal额外研究(三):IFrame Portlet地session丢失疑难处理

       Liferay提供了一种非常的简单web应用整合和单点登陆的方式:Iframe Portlet.利用Iframe Portlet可以很容易将一个已经存在的web应用纳入,并且支持利用form的post或get方式,实现用户的登陆.          对于Liferay这样的机制没有任何问题,实现的也非常巧妙:但是对于很多web应用系统来说,使用Liferay IFrame Portlet的form方式实现登陆后,虽然可以成功登陆,但是在显示的新页面中,却发现用户信息丢失,或者更准确

Liferay 从Dockbar 添加Portlet的事件细节研究

Part 1: 从页面点击"Add"过程找出事件处理函数: 在Liferay中,当我们从左边选择一个Portlet并且添加的时候,会触发一系列的动作,并且最终把这个Portlet显示在页面上,现在我们就对这个神秘的过程进行窥测. 在页面上,为了找到我们点击Add之后绑定的事件处理函数,我们先找到这段代码对应的jsp页面在/html/portlet/layout_configuration/view_category.jsp中: <div class="lfr-portl

请问哪位高手对Liferay Portal 的源码有研究?或者对在Liferay Portal 上进行Portlet开发有研究的,请指点一下学习路线。谢谢

问题描述 请问哪位高手对LiferayPortal的源码有研究?或者对在LiferayPortal上进行Portlet开发有研究的,请指点一下学习路线.谢谢 解决方案 解决方案二:以前想用来着,LIFERAY太大大难,作罢.解决方案三:在源码上开发了3个月,还是有点理不清,那东西有点难!不好说.

Liferay研究之二十:如何防止连续重复提交

一般的解决连续重复提交的办法有以下几种. 方法一.提交后 禁用提交按钮(大部分人都是这样做的)方法二.使用Session, session里面加令牌,第一次设置一个值,以后请求先与这个令牌进行比较:方法三.数据处理成功马上Redirect到另外一个页面 Liferay中前台使用了客户端脚本(可能是JQuery,没仔细研究).Session,后台采用同步.多线程等来解决这个问题.服务端解决的具体思路如下: 在Session中放一个DoubleClickControlor的实例,然后对这个实例进行同

Liferay Portlet中的文件上传研究

我们已经知道了许许多多种类的处理文件上传的代码,比较典型的比如Apache大名鼎鼎的FileUpload等,当然了, Liferay为我们都考虑过了,我们可以用Liferay自带的上传文件的API来处理文件上传问题,这个核心接口就是com.liferay.portal.kernel.upload.UploadPortletRequest接口. 举个最简单的例子,比如我们要在Portlet页面上传一个文件到Portlet中,然后Portlet吧这个文件移动到别的位置: 那么,在页面上(比如conf

java开源项目研究 1. 引子

项目       一夜之间,开源项目仿佛无处不在,几乎覆盖了包括操作系统.网络通讯.桌面环境.教育.办公.安全.文字处理.数据库.中间件.应用娱乐在内的所有软件类型.在最大的开源项目发布平台www.sourceforge.net上,已经有近十万件开源项目,并且每天都有更多新的开源项目加入.而著名的www.apache.org则为大家奉献了Apache.Tomcat.Struts .Axis等.       开源运动是程序员对智慧成果共享.自由的追求,每天都有无数程序员为开源世界添砖加瓦,还有更多

java开源项目研究

项目 一夜之间,开源项目仿佛无处不在,几乎覆盖了包括操作系统.网络通讯.桌面环境.教育.办公.安全.文字处理.数据库.中间件.应用娱乐在内的所有软件类型.在最大的开源项目发布平台www.sourceforge.net上,已经有近十万件开源项目,并且每天都有更多新的开源项目加入.而著名的www.apache.org则为大家奉献了Apache.Tomcat.Struts .Axis等. 开源运动是程序员对智慧成果共享.自由的追求,每天都有无数程序员为开源世界添砖加瓦,还有更多的程序员在学习开源软件的

Liferay标记详解

在如下图所示的添加Portlet的文本显示,有一个非常有趣的特性: 当我们吧文本的代码替换成小写的"add",则最终显示出来的是大写的"Add",而我们把文本替换成小写的"modify",则原封不动显示的是"modify",这是什么特性呢? 为此,我们可以进行一系列的研究,首先我们定位到显示这个文字的代码,它位于/html/portlet/layout_configuration/view_category.jsp的第138行

Liferay集群中在一个节点上上传照片另外一个节点无法看到的问题的解决

Reproduce the procedure: 上次他们有一个集群上的问题,就是从节点1的控制面板中,上传一个图片,然后关闭节点1, 从节点2中看不到这个图片.这个问题的流程如下: Following are the steps for the clustering issues    Go to Control Panel.    Click on "Documents and Media" from Left Nav.    Add folder    Add Basic doc