14 - Servlet Filters: Page 2 of 3

14.6 Examples

14.6.1 Write an example to demonstrate filter life cycle?

Solution – To demonstrate the life cycle, let’s define and write one filter which will print some message in  filter life cycle methods on server console to see how many times the methods are getting invoked.> a)    Define filter in web.xml

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.servlet.tutorial.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  1. Write MyFilter.java
package com.servlet.tutorial;
import java.io.IOException;
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 MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
        System.out.println("Filter initialized...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter executing...");
        filterChain.doFilter(request, response);
}
@Override
public void destroy() 
{
        System.out.println("Filter Destroyed..");
}
}

Testing

As soon as web application is deployed, filter will be initialized which we can verify from the message on console.

Then Hit the url http://localhost:8080/HelloWorld/login.html three times

Then un deploy the web application so filter will be destroyed

Since we mapped /* url pattern with Filter, it will be invoked for all URLs so we tested it with http://localhost:8080/HelloWorld/login.html but can see the same behaviour with other URL.

14.6.2 In above section, we discussed the order of execution of multiple filter and servlet. Demonstrate this behaviour with the help of explain.

Solution – To demonstrate the order of execution of multiple filter and servlet, lets define two filter FilterA and FilterB and apply it on Servlet.

  1. Define Servlet and Filters entries in web.xml
<filter>
<filter-name>FilterA</filter-name>
<filter-class>com.servlet.tutorial.FilterA</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterA</filter-name>
<url-pattern>/ProtectedServlet</url-pattern>
</filter-mapping>
<filter>
<filter-name>FilterB</filter-name>
<filter-class>com.servlet.tutorial.FilterB</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterB</filter-name>
<url-pattern>/ProtectedServlet</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>ProtectedServlet</servlet-name>
<servlet-class>com.servlet.tutorial.ProtectedServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProtectedServlet</servlet-name>
<url-pattern>/ProtectedServlet</url-pattern>
</servlet-mapping>

  1. Write Filter and Servlet Code
package com.servlet.tutorial;
import java.io.IOException;
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 FilterA implements Filter
{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
    System.out.println("Filter A initialized...");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain filterChain) throws IOException, ServletException
    {
        System.out.println("Filter A executing Before Servlet Processing ...");
        filterChain.doFilter(request, response);
        System.out.println("Filter A executing after Servlet Processing...");
    }
    @Override
    public void destroy() {
        System.out.println("Filter A Destroyed..");
    }
}
package com.servlet.tutorial;
import java.io.IOException;
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 FilterB implements Filter {    
@Override
public void init(FilterConfig filterConfig) throws ServletException 
{
    System.out.println("Filter B initialized...");
}   
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException
{
    System.out.println("Filter B executing Before Servlet Processing ...");
    filterChain.doFilter(request, response);
    System.out.println("Filter B executing after Servlet Processing...");
}               
@Override
public void destroy() 
{
    System.out.println("Filter B Destroyed..");
}   
}       
package com.servlet.tutorial;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ProtectedServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
{
    System.out.println("Protected Servlet Executing");
}
}

Testing

Hit the url http://localhost:8080/HelloWorld/ProtectedServlet and you can see the messages shown in below figure.

This proves “ F1 -> F2 -> F3 . . . Fn ->  Servlet ->Fn -> Fn-1 . . F1 “

14.6.3 – In the above example, what is the significance of filterChain.doFilter() ?

Solution – filterChain.doFilter() invokes the another filter configured in web.xml. Once all the filter is executed, calling of doFilter() invokes the servlet. Once servlet is executed, lines after filterchain.doFilter() get executed in a reverse order.

14.6.4 – Write and example to show how filter can modify request and response

Solution- To see how filter can modify the request and response, let’s create

  1. One  html which will have one input field – name
  2. One filter which will grab the value of  input filed and examine if it is blank or not. If the value is blank , filter will respond back with the error message that and will not pass the request to servlet.
  3. If value is entered by user , servlet which will be executed and will respond back with the value
  1. Add entry in web.xml
<filter>
    <filter-name>RequestInterceptorFilter</filter-name>
    <filter-class>com.servlet.tutorial.RequestInterceptorFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>RequestInterceptorFilter</filter-name>
    <url-pattern>/ProtectedServlet</url-pattern>
</filter-mapping> 
<servlet>
    <servlet-name>ProtectedServlet</servlet-name>
    <servlet-class>com.servlet.tutorial.ProtectedServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ProtectedServlet</servlet-name>
    <url-pattern>/ProtectedServlet</url-pattern>
</servlet-mapping>

  1. Create input.html
<!DOCTYPE html>
<html>
<head>
<title> Form</title>
</head>
<body>
<form name="inputForm" action="ProtectedServlet" method="POST">
Name: <input type="text" name="name"/>
<br/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>

  1. Write Filter code
package com.servlet.tutorial;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
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 RequestInterceptorFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter  initialized...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
    String name = request.getParameter("name");
    if(name==null || name.equals(""))
    {
        PrintWriter writer = response.getWriter();
        String message="Name can not be blank.";
        writer.println(message);
        return;
    }
        filterChain.doFilter(request, response);
    }
    @Override
    public void destroy() {
        System.out.println("Filter  Destroyed..");
    }
}

  1. Write Servlet Code
package com.servlet.tutorial;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ProtectedServlet extends HttpServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
    String name = request.getParameter("name");
    PrintWriter writer = response.getWriter();
    String message="You have entered " + name;
    writer.println(message);
}
}

Testing

Hit the url http://localhost:8080/HelloWorld/input.html and do not enter any value in name input box.

Hit the url http://localhost:8080/HelloWorld/input.html and  enter any value in name input box.

This way we can intercept the request and allow request to reach servlet only if it passes certain criteria.

Similarly we can have a generic logic in filter which can be applied to multiple servlets and we need not to repeat the logic at several places.

Like us on Facebook