liferay过滤器(二)

liferay的过滤器基本上都可以在portal-ext.properties文件里面进行设置是否使用(true or false)

1、GZipFilter过滤器

主要代码:

if (isCompress(request) && !isInclude(request) &&
   BrowserSnifferUtil.acceptsGzip(request) &&
   !isAlreadyFiltered(request)) {

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

    _log.debug("Compressing " + completeURL);
   }

   request.setAttribute(SKIP_FILTER, Boolean.TRUE);

   GZipResponse gZipResponse = new GZipResponse(response);

   processFilter(GZipFilter.class, request, gZipResponse, filterChain);

扫描二维码关注公众号,回复: 799260 查看本文章

   gZipResponse.finishResponse();
  }
  else {
   if (_log.isDebugEnabled()) {
    String completeURL = HttpUtil.getCompleteURL(request);

    _log.debug("Not compressing " + completeURL);
   }

   processFilter(
    GZipFilter.class, request, response, filterChain);
  }

主要功能:截获输出进行处理,写入到真正的HttpServletResponse中(在源代码中没有找到处理的代码,压缩处理代码参看:http://blog.csdn.net/hongweigg/article/details/6197445

2、Header Filter过滤器

主要代码:

Enumeration<String> enu = _filterConfig.getInitParameterNames();

  while (enu.hasMoreElements()) {
   String name = enu.nextElement();

   if (name.equals(_URL_REGEX_PATTERN)) {
    continue;
   }

   String value = _filterConfig.getInitParameter(name);

   if (name.equals(_EXPIRES) && Validator.isNumber(value)) {
    int seconds = GetterUtil.getInteger(value);

    Calendar cal = new GregorianCalendar();

    cal.add(Calendar.SECOND, seconds);

    value = _dateFormat.format(cal.getTime());
   }

   // LEP-5895

   boolean addHeader = true;

   if (name.equalsIgnoreCase(HttpHeaders.CACHE_CONTROL)) {
    HttpSession session = request.getSession(false);

    if ((session == null) || session.isNew()) {
     addHeader = false;
    }
   }

   if (addHeader) {
    response.addHeader(name, value);
   }
  }

  long lastModified = getLastModified(request);
  long ifModifiedSince = request.getDateHeader(
   HttpHeaders.IF_MODIFIED_SINCE);

  if (lastModified > 0) {
   response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModified);

   if (lastModified <= ifModifiedSince) {
    response.setDateHeader(
     HttpHeaders.LAST_MODIFIED, ifModifiedSince);
    response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);

    return;
   }
  }
功能:添加页面过期时间的参数,根据filter config属性文件中的Expires

3、I18n 过滤器

主要代码:

String contextPath = PortalUtil.getPathContext();

  String requestURI = request.getRequestURI();

  if ((Validator.isNotNull(contextPath)) &&
   (requestURI.indexOf(contextPath) != -1)) {

   requestURI = requestURI.substring(contextPath.length());
  }

  requestURI = StringUtil.replace(
   requestURI, StringPool.DOUBLE_SLASH, StringPool.SLASH);

  String i18nLanguageId = requestURI.substring(1);

  int pos = requestURI.indexOf(StringPool.SLASH, 1);

  if (pos != -1) {
   i18nLanguageId = i18nLanguageId.substring(0, pos - 1);
  }

  if (_languageIds.contains(i18nLanguageId)) {
   return null;
  }

  String defaultLanguageId = LocaleUtil.toLanguageId(
   LocaleUtil.getDefault());

  String guestLanguageId = CookieKeys.getCookie(
   request, CookieKeys.GUEST_LANGUAGE_ID);

  if (Validator.isNull(guestLanguageId)) {
   guestLanguageId = defaultLanguageId;
  }

  if (PropsValues.LOCALE_PREPEND_FRIENDLY_URL_STYLE == 1) {
   if (!defaultLanguageId.equals(guestLanguageId)) {
    i18nLanguageId = guestLanguageId;
   }
   else {
    return null;
   }
  }
  else if (PropsValues.LOCALE_PREPEND_FRIENDLY_URL_STYLE == 2) {
   i18nLanguageId = guestLanguageId;
  }

  if (i18nLanguageId == null) {
   return null;
  }

  String i18nPath = StringPool.SLASH + i18nLanguageId;

  Locale locale = LocaleUtil.fromLanguageId(i18nLanguageId);

  if (!LanguageUtil.isDuplicateLanguageCode(locale.getLanguage())) {
   i18nPath = StringPool.SLASH + locale.getLanguage();
  }
  else {
   Locale priorityLocale = LanguageUtil.getLocale(
    locale.getLanguage());

   if (locale.equals(priorityLocale)) {
    i18nPath = StringPool.SLASH + locale.getLanguage();
   }
  }

  String redirect = contextPath + i18nPath + requestURI;

  LayoutSet layoutSet = (LayoutSet)request.getAttribute(
   WebKeys.VIRTUAL_HOST_LAYOUT_SET);

  if ((layoutSet != null) &&
   (requestURI.startsWith(_PRIVATE_GROUP_SERVLET_MAPPING) ||
    requestURI.startsWith(_PRIVATE_USER_SERVLET_MAPPING) ||
    requestURI.startsWith(_PUBLIC_GROUP_SERVLET_MAPPING))) {

   int x = requestURI.indexOf(StringPool.SLASH, 1);

   if (x == -1) {

    // /web

    requestURI += StringPool.SLASH;

    x = requestURI.indexOf(StringPool.SLASH, 1);
   }

   int y = requestURI.indexOf(StringPool.SLASH, x + 1);

   if (y == -1) {

    // /web/alpha

    requestURI += StringPool.SLASH;

    y = requestURI.indexOf(StringPool.SLASH, x + 1);
   }

   String groupFriendlyURL = requestURI.substring(x, y);

   Group group = layoutSet.getGroup();

   if (group.getFriendlyURL().equals(groupFriendlyURL)) {
    redirect = contextPath + i18nPath + requestURI.substring(y);
   }
  }

  String queryString = request.getQueryString();

  if (Validator.isNotNull(queryString)) {
   redirect += StringPool.QUESTION + request.getQueryString();
  }

  return redirect;

主要功能:重新组装重定向URL(设置语言的ID)。

4、Language过滤器

主要代码:

HttpServletRequest request, StringServletResponse stringResponse) {

  String languageId = LanguageUtil.getLanguageId(request);
  Locale locale = LocaleUtil.fromLanguageId(languageId);

  String content = stringResponse.getString();

  StringBundler sb = new StringBundler();

  Matcher matcher = _pattern.matcher(content);

  int x = 0;

  while (matcher.find()) {
   int y = matcher.start(0);

   String key = matcher.group(1);

   sb.append(content.substring(x, y));
   sb.append(StringPool.APOSTROPHE);

   String value = null;

   if (_portletConfig != null) {
    value = UnicodeLanguageUtil.get(_portletConfig, locale, key);
   }
   else {
    value = UnicodeLanguageUtil.get(locale, key);
   }

   sb.append(value);
   sb.append(StringPool.APOSTROPHE);

   x = matcher.end(0);
  }

  sb.append(content.substring(x));

  return sb.toString();

功能:取得语言的id,根据id设置语言name,写到response中

5、Minifier过滤器

主要代码:

猜你喜欢

转载自xijunhu.iteye.com/blog/1128073