首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

liferay过滤器(1)

2012-07-29 
liferay过滤器(一)1、Audit Filter过滤器filter??filter-nameAudit Filter/filter-name??filter-cla

liferay过滤器(一)

1、Audit Filter过滤器

<filter>
??<filter-name>Audit Filter</filter-name>
??<filter-class>com.liferay.portal.servlet.filters.audit.AuditFilter</filter-class>
?</filter>

主要代码:

auditRequestThreadLocal.setClientHost(request.getRemoteHost());
??auditRequestThreadLocal.setClientIP(request.getRemoteAddr());
??auditRequestThreadLocal.setQueryString(request.getQueryString());

HttpSession session = request.getSession();

??Long userId = (Long)session.getAttribute(WebKeys.USER_ID);

??if (userId != null) {
???auditRequestThreadLocal.setRealUserId(userId.longValue());
??}

??auditRequestThreadLocal.setRequestURL(
???request.getRequestURL().toString());
??auditRequestThreadLocal.setServerName(request.getServerName());
??auditRequestThreadLocal.setServerPort(request.getServerPort());
??auditRequestThreadLocal.setSessionID(request.getSession().getId());

把客户端的主机名、IP、查询字符串和服务器端的主机名、端口号、客户访问产生的session、客户的userId放到auditRequestThreadLocal对象中。

?

2、AutoLoginFilter过滤器

<filter>
??<filter-name>Auto Login Filter</filter-name>
??<filter-class>com.liferay.portal.servlet.filters.autologin.AutoLoginFilter</filter-class>
?</filter>

主要代码:

String remoteUser = request.getRemoteUser();
??String jUserName = (String)session.getAttribute("j_username");

?String[] credentials = autoLogin.login(request, response);

?????String redirect = (String)request.getAttribute(
??????AutoLogin.AUTO_LOGIN_REDIRECT);

?????if (Validator.isNotNull(redirect)) {
??????response.sendRedirect(redirect);

??????return;
?????}

?????String loginRemoteUser = getLoginRemoteUser(
??????request, response, session, credentials);

?????if (loginRemoteUser != null) {
??????request = new ProtectedServletRequest(
???????request, loginRemoteUser);

??????if (PropsValues.PORTAL_JAAS_ENABLE) {
???????return;
??????}

??????redirect = (String)request.getAttribute(
???????AutoLogin.AUTO_LOGIN_REDIRECT_AND_CONTINUE);

??????if (Validator.isNotNull(redirect)) {
???????response.sendRedirect(redirect);

???????break;
??????}
?????}

?

取得登陆的用户信息,如果用户信息正确,自动跳转到登陆页面,为空则重定向。

?

3、Cache Filter - Friendly过滤器

<filter>
??<filter-name>Cache Filter - Friendly</filter-name>
??<filter-class>com.liferay.portal.servlet.filters.cache.CacheFilter</filter-class>
??<init-param>
???<param-name>pattern</param-name>
???<param-value>0</param-value>
??</init-param>
?</filter>

参数pattern:0、PATTERN_FRIENDLY;1、PATTERN_LAYOUT;2、PATTERN_RESOURCE

主要代码:

request.setAttribute(SKIP_FILTER, Boolean.TRUE);

???String key = getCacheKey(request);

???long companyId = PortalInstances.getCompanyId(request);

???CacheResponseData cacheResponseData =
????CacheUtil.getCacheResponseData(companyId, key);

???if (cacheResponseData == null) {
????if (!isCacheableData(companyId, request)) {
?????if (_log.isDebugEnabled()) {
??????_log.debug("Request is not cacheable " + key);
?????}

?????processFilter(
??????CacheFilter.class, request, response, filterChain);

?????return;
????}

????if (_log.isInfoEnabled()) {
?????_log.info("Caching request " + key);
????}

????StringServletResponse stringResponse =
?????new StringServletResponse(response);

????processFilter(
?????CacheFilter.class, request, stringResponse, filterChain);

????cacheResponseData = new CacheResponseData(stringResponse);

????LastPath lastPath = (LastPath)request.getAttribute(
?????WebKeys.LAST_PATH);

????if (lastPath != null) {
?????cacheResponseData.setAttribute(WebKeys.LAST_PATH, lastPath);
????}

????// Cache the result if and only if there is a result and the
????// request is cacheable. We have to test the cacheability of a
????// request twice because the user could have been authenticated
????// after the initial test.

????if (isCacheableRequest(request) &&
?????isCacheableResponse(stringResponse)) {

?????CacheUtil.putCacheResponseData(
??????companyId, key, cacheResponseData);
????}
???}
???else {
????LastPath lastPath = (LastPath)cacheResponseData.getAttribute(
?????WebKeys.LAST_PATH);

????if (lastPath != null) {
?????HttpSession session = request.getSession();

?????session.setAttribute(WebKeys.LAST_PATH, lastPath);
????}
???}

???CacheResponseUtil.write(response, cacheResponseData);

?

首先判断是否支持缓存,如果支持,判断缓存中是否有数据,如果有数据直接把数据写到response中,如果没有,判断有没有companyId,如果有,从response中取数据过滤,最后放到cacheResponseData中。

?

?4、Double Click Filter过滤器

<filter>
??<filter-name>Double Click Filter</filter-name>
??<filter-class>com.liferay.portal.servlet.filters.doubleclick.DoubleClickFilter</filter-class>
?</filter>

主要代码:

DoubleClickController controller = null;

???synchronized (session) {
????controller = (DoubleClickController)session.getAttribute(
?????_CONTROLLER_KEY);

????if (controller == null) {
?????controller = new DoubleClickController();

?????session.setAttribute(_CONTROLLER_KEY, controller);
????}
???}

如果属性com.liferay.filters.doubleclick.DoubleClickFilter=true,则处理在服务器端阻止鼠标双击。

?

5、ETag Filter过滤器

<filter>
??<filter-name>ETag Filter</filter-name>
??<filter-class>com.liferay.portal.servlet.filters.etag.ETagFilter</filter-class>
??<init-param>
???<param-name>url-regex-ignore-pattern</param-name>
???<param-value>.+/-/.+</param-value>
??</init-param>
?</filter>

主要代码:

boolean etag = ParamUtil.getBoolean(request, _ETAG, true);

??if (etag) {
???StringServletResponse stringResponse =
????new StringServletResponse(response);

???processFilter(
????ETagFilter.class, request, stringResponse, filterChain);

???if (!ETagUtil.processETag(request, response, stringResponse)) {
????ServletResponseUtil.write(response, stringResponse);
???}
??}
??else {
???processFilter(ETagFilter.class, request, response, filterChain);
??}

?

ETag Filter是一个servlet过滤器,是用来帮助判断服务器端的有没有跟新,即刷新页面时判断是否需要更新缓存。

?

6、Fragment Filter过滤器

主要代码:

if (isFragment(request, response) && !isAlreadyFiltered(request)) {
???request.setAttribute(SKIP_FILTER, Boolean.TRUE);

???if (_log.isDebugEnabled()) {
????String completeURL = HttpUtil.getCompleteURL(request);

????_log.debug("Fragmenting " + completeURL);
???}

???StringServletResponse stringServerResponse =
????new StringServletResponse(response);

???processFilter(
????FragmentFilter.class, request, stringServerResponse,
????filterChain);

???String content = getContent(
????request, stringServerResponse.getString());

???ServletResponseUtil.write(response, content);
??}
??else {
???if (_log.isDebugEnabled()) {
????String completeURL = HttpUtil.getCompleteURL(request);

????_log.debug("Not fragmenting " + completeURL);
???}

???processFilter(FragmentFilter.class, request, response, filterChain);
??}

protected String getContent(HttpServletRequest request, String content) {
??String fragmentId = ParamUtil.getString(request, "p_f_id");

??int x = content.indexOf("<!-- Begin fragment " + fragmentId + " -->");
??int y = content.indexOf("<!-- End fragment " + fragmentId + " -->");

??if ((x == -1) || (y == -1)) {
???return content;
??}

??x = content.indexOf(">", x);

??return content.substring(x + 1, y);
?}

?

把response里面的portalet产生的内容,也被称为片段 (fragment),进行过滤(即把头和尾去掉),然后写到response中

热点排行