Sunday, February 21, 2016

Liferay Servlet Filter Hooks

Liferay hooks are great way of customize the Liferay portal. Hooks can customize most of the existed portal behaviour. In the each version of Liferay release they have introduced new types hook plugins to make maximum avoid of EXT plugins

Liferay 6.1 have come up with new type of hook plugin called Servlet Filter. Before Liferay 6.1 If you would like to create new Servlet filer then we had to use EXT plugin types and as we know that EXT plugins are little difficult to develop and also its maintenance.

Servlet filter hooks are one of great feature so that we can create new servlet filters and deploy into portal. From Liferay 6.1 version onwards these feature available.

Servlet Filters

Servlet filter is an object that intercept http request to perform pre or post tasks in web applications before request reach back end or before response reach client. Some time we might need to perform set of tasks before request reach backend that is controller. We can also perform post tasks before response reach client.

We have these filters for different contextual use such as Authentication Filters, Compression Filters, Encryption Filters, Image compression filters and Tokenizing filters.

General pictorial understanding of Servlet Filter


Servlet Filter Implementation in Web applications

Step: 1

In order to implement servlet filer we must implement javax.servlet.Filter interface and these interface have following methods so we must implement all methods.


public void doFilter (ServletRequest, ServletResponse, FilterChain)

For each time of request doFilter (--) method will be calling and we will perform actual task in this method.

public void init(FilterConfig filterConfig)

This method we will called when servlet container instantiate filter object and in order to perform some initialization tasks we will use this method.
           
public void destroy()

When we stop server or when we undeploy web application then this method will be called.


Step: 2

We should register servlet filer in web application web.xml file. In the configuration we will define name of servlet filter and its implementation class. We will also define filter matching path so that when we request server with specific URL path then respective servlet filer will be executed and it will perform the task.

Example for Servlet Filter in Web application

Servlet Implementation class


package com.liferaysavvy.servletfilter;

import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
                             
public class SampleServletFilter implements Filter {

public void init(FilterConfig config) throws ServletException {

System.out.println("Init method being called");

/*
* If we define init parameter in web.xml the following method retrive
* the configured value
*/
String intiParamValue = config.getInitParameter("initparam");
System.out.println("initParamValue: " + initParamValue);
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws java.io.IOException, ServletException {

System.out.println("DoFilter method being called");

/* Retrive the IP address of client from where user requested */
String clientIPAddress = request.getRemoteAddr();

// Display or save the IP address of requested client.
System.out.println("Requested Client IP Address" + clientIPAddress
+ ", Time " + new Date().toString());

/* Pass request back down the filter chain */
chain.doFilter(request, response);
}

public void destroy() {
/*
* This method will be executed when we undeploy application or stop
* server
*/
System.out.println("Destroy method being called");
}

}


Servlet filter Configuration in web.xml


<filter>
   <filter-name>SampleIPAddresFilter</filter-name>
   <filter-class>com.liferaysavvy.servletfilter.SampleServletFilter</filter-class>
   <init-param>
              <param-name>initparam</param-name>
              <param-value>Hello IP Address Filter</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>SampleIPAddresFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>


Note:

URL path we made it * it means Filter will be executed for every request and we can also make other URL patterns that you desired.

Example:


/user/*
/content/news/*
/login/sso


Servlet filters in Liferay Portal

Liferay is huge portal or its web application and it consist many servlet filters for different purposes. All these servlet filters are configured in Liferay portal web.xml and Liferay-web.xml files.

We have many Liferay servlet filters such as CASFilter, SSOFilter, NTLMFilter and many more filters are already implemented in Liferay portal.


If we want create new servlet filters in Liferay we will use Servlet Filter Hook plugins. Servlet filter hook plugins are the way to implement filters and deploy into Liferay portal.

Servlet filters implementation in Liferay hook is same as implementation in general web application. We will use same above steps as we discussed in the above section. Only difference is that we will configure filter definition in liferay-hook.xml file with different xml tags than web.xml file.

Steps to Implement Servlet Filters in Liferay Hooks.

  1. Create Liferay Hook Plugin
  2. Implement Servlet Filter
  3. Configure Filter Definition in liferay-hook.xml file


Create Liferay Hook Plugin

Creating hook using Liferay IDE is very straight forward way and its easy. Follow below articles to create Liferay hook plugin.


Implement Servlet Filter

Once created the hook using Liferay IDE then create Servlet Filter and use same steps that we have used in Servlet Filter implementation for general web applications. I used same implementation in Liferay servlet filter also.

Liferay Servlet Implementation Java class


package com.liferaysavvy.servletfilter;

import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;

public class LiferayIPAddressServletFilter implements Filter {

public void init(FilterConfig config) throws ServletException {

logger.info("Init method being called");

/*
* If we define init parameter in web.xml the following method retrive
* the configured value
*/
String intiParamValue = config.getInitParameter("initparam");
logger.info("intiParamValue: " + intiParamValue);
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws java.io.IOException, ServletException {

logger.info("DoFilter method being called");

/* Retrive the IP address of client from where user requested */
String clientIPAddress = request.getRemoteAddr();

// Display or save the IP address of requested client.
logger.info("Requested Client IP Address" + clientIPAddress + ", Time "
+ new Date().toString());

/* Pass request back down the filter chain */
chain.doFilter(request, response);
}

public void destroy() {
/*
* This method will be executed when we undeploy application or stop
* server
*/
logger.info("Destroy method being called");
}

private static final Log logger = LogFactoryUtil
.getLog(LiferayIPAddressServletFilter.class);
}


Configure Filter Definition in liferay-hook.xml file

Use the following configuration in liferay-hook.xml file and its slight different than the configuration we used in web.xml file for general web applications.


<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
<hook>
            <servlet-filter>
                        <servlet-filter-name>SampleIPAddresFilter</servlet-filter-name>
                        <servlet-filter-impl>com.liferaysavvy.servletfilter.LiferayIPAddressServletFilter</servlet-filter-impl>
                        <init-param>
                                    <param-name>initparam</param-name>
                                    <param-value>Hi IP Address Filter</param-value>
                        </init-param>
            </servlet-filter>
            <servlet-filter-mapping>
                        <servlet-filter-name>SampleIPAddresFilter</servlet-filter-name>
                        <url-pattern>/*</url-pattern>
                        <dispatcher>REQUEST</dispatcher>
                        <dispatcher>FORWARD</dispatcher>
            </servlet-filter-mapping>
</hook>


Once finished the implementation then deploy the hook plugin in Liferay portal server then you can see following output in the console.

Sample output after deploy hook plugin in Liferay portal server


12:19:25,228 INFO  [localhost-startStop-5][HookHotDeployListener:693] Registering hook for LiferayIPAddressFilter-hook
12:19:25,252 INFO  [localhost-startStop-5][LiferayIPAddressServletFilter:19] Init method being called
12:19:25,253 INFO  [localhost-startStop-5][LiferayIPAddressServletFilter:26] intiParamValue: Hi IP Address Filter
12:19:25,253 INFO  [localhost-startStop-5][HookHotDeployListener:821] Hook for LiferayIPAddressFilter-hook is available for use
12:19:33,393 INFO  [http-bio-8080-exec-37][LiferayIPAddressServletFilter:32] DoFilter method being called
12:19:33,394 INFO  [http-bio-8080-exec-37][LiferayIPAddressServletFilter:38] Requested Client IP Address127.0.0.1, Time Sun Feb 21 12:19:33 GMT 2016
12:19:33,782 INFO  [http-bio-8080-exec-37][LiferayIPAddressServletFilter:32] DoFilter method being called
12:19:33,811 INFO  [http-bio-8080-exec-37][LiferayIPAddressServletFilter:38] Requested Client IP Address127.0.0.1, Time Sun Feb 21 12:19:33 GMT 2016
12:19:34,494 INFO  [http-bio-8080-exec-37][LiferayIPAddressServletFilter:32] DoFilter method being called
12:19:34,494 INFO  [http-bio-8080-exec-37][LiferayIPAddressServletFilter:38] Requested Client IP Address127.0.0.1, Time Sun Feb 21 12:19:34 GMT 2016



Author

Popular Posts

Recent Posts

Recent Posts Widget