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中