< Prev
Next >



Filter Chain



In this article, we are going to understand how to associated a chain of filters with a web resource. The web resource could be a Servlet, JSP or a static html webpage. Using the feature of filter, we can perform many tasks within a web application such as - session validation, user authentication and verification , restricting access to a particular web resource etc.

We can create multiple Filter classes by implementing the Filter interface. After associated these Filter class with a web resource, when a user make a request to a web resource, the Filter classes associated with are executed before the before and after the web resource requested by the user is executed, hence providing filtering to the user request and response.


Multiple filters associated with a web resource are executed in the order of <filter-mapping> tag specified in the deployment descriptor file(web.xml).




Methods of Filter interface


In order to create a filter class we must implement the three methods of javax.servlet.Filter interface.

Methods Description
void doInit(FilterConfig config) This method initializes the Filter.
void doFilter(ServletRequest request, ServletResponse, response, FilterChain chain) This method is called by the web container when a client requests for a web resource which could be a Servlet or a JSP page .
void destroy() This method destroys the Filter instance.





Creating a webpage which calls the Servlet


We are creating a webpage which asks the user to enter his name and click the submit button, which when clicked, will call a Servlet, but before this Servlet is executed, two filters associated with it will be executed in the order of <filter-mapping> tag specified in the deployment descriptor file(web.xml).

Webpage1.jsp
<html>

<head>
<title> Filters Demo </title>
</head>


<body>

<b> Please enter your name : ? </b>
<br/>
<br/>
<br/>

<form action ="MyServ">
Name : <input type = "text"  name = "name" />
<input type = "submit"  name = "submit" />
</form>

</body>
</html>





Creating Filter


We are creating a Filter by implementing the Filter interface and by implementing its three methods -


Within the doFilter(ServletRequest, ServletResponse, FilterChain) method, we must make a call to doFilter(request, response) method of FilterChain interface.


MyFilter1.java
import java.io.*;
import javax.servlet.*;


public class MyFilter1 implements Filter
{


public void init(FilterConfig filterConfig) 
{
}

public void destroy()
{
}


//This method is called each time a client requests for a web resource 
// which could be a Servlet or a JSP page i.e. preprocessing request
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();


out.println("<b> <i>Filter1 - Filtering request</i> </b>");
out.println("Hello " + request.getParameter("name") + "!");

out.println("<br/>");
out.println("<br/>");
out.println("<br/>");


//Calling  doFilter() calls the next filter in the chain will execute or 
//if there is no filter then the requested web resource is executed.
chain.doFilter(request,response);

out.println("<br/>");
out.println("<br/>");
out.println("<br/>");


//post-processing the request and after the requested web resource is called.
out.println("<b> <i>Filter2 - Filtering response</i> </b>");
out.println("Bye " + request.getParameter("name") + "!");

}

}



MyFilter2.java
import java.io.*;
import javax.servlet.*;


public class MyFilter1 implements Filter
{


public void init(FilterConfig filterConfig) 
{
}

public void destroy()
{
}


//This method is called each time a client requests for a web resource 
// which could be a Servlet or a JSP page i.e. preprocessing request
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();


out.println("<b> <i>Filter2 - Filtering request</i> </b>");
out.println("Hello " + request.getParameter("name") + "!");

out.println("<br/>");
out.println("<br/>");
out.println("<br/>");


//Calling  doFilter() calls the next filter in the chain will execute or 
//if there is no filter then the requested web resource is executed.
chain.doFilter(request,response);

out.println("<br/>");
out.println("<br/>");
out.println("<br/>");


//post-processing the request and after the requested web resource is called.
out.println("<b> <i>Filter1 - Filtering response</i> </b>");
out.println("Bye " + request.getParameter("name") + "!");

}

}






MyServlet1.java is a Servlet class, which is executed after its associated filter is executed.

MyServlet1.java
import java.io.*;
import javax.servlet.*;

public class MyServlet1 extends GenericServlet
{


public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException
{

response.setContentType("text/html");
PrintWriter out = response.getWriter();

out.println("The requested Servlet is being executed.");
}
}






Directory Structure of Servlet files




The diagram above depicts how to arrange the Servlet files in a specific directory structure, as per Java Servlet Specification-






Creating the Deployment Descriptor file


As per the Java Servlet specifications, every web application based on Servlet must have a Deployment Descriptor file(an XML file) named web.xml. So, let's create one and this time, associate our two filter classes with our Servlet class -


web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="true">

  <display-name>Welcome tomcat</display-name>
  <description>
     Welcome tomcat
  </description>

  
<filter>
 	<filter-name>Filter1</filter-name>
	<filter-class>MyFilter1</filter-class>
</filter>


<filter>
 	<filter-name>Filter2</filter-name>
	<filter-class>MyFilter2</filter-class>
</filter>






<filter-mapping>
	<filter-name>Filter1</filter-name>
	<url-pattern>/MyServ</url-pattern>
</filter-mapping>



<filter-mapping>
	<filter-name>Filter2</filter-name>
	<url-pattern>/MyServ</url-pattern>
</filter-mapping>




<servlet>
 	<servlet-name>Servlet</servlet-name>
	<servlet-class>MyServlet1</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>Servlet</servlet-name>
	<url-pattern>/MyServ</url-pattern>
</servlet-mapping>

</web-app>


In deployment descriptor file, The <filter> has two child tags <filter-name> and <filter-class>.




<servlet> has two child tags <servlet-name> and <servlet-class> :








Note







Setting the classpath


Much of the support for developing the web applications based on the Java Servlet technology does not come with the core Java. Hence, in order to compile the Servlet programs, we have to set the classpath to a jar file named servlet-api.jar.

This jar file provides all the classes that are required for the Servlet programming and it comes within the lib Folder of Tomcat installation folder.

For example, in our case we have installed Tomcat Web Server within the C: Drive, hence the path to our lib folder containing the servlet-api.jar is - C:\apache-tomcat-9.0.2\lib

There are two ways to set the classpath -




Compiling the Servlet class


After setting the classpath, you need to compile the filter and the Servlet class by entering the command at the folder where you've stored the Servlet class file.

javac -d WEB-INF/classes MyFilter1.java


javac -d WEB-INF/classes MyFilter2.java


javac -d WEB-INF/classes MyServlet1.java





Executing the Servlet


We are creating a webpage which asks the user to enter his name and click the submit button, First we execute the webpage containing the form, asking the user to enter the name and press submit button.





Hence, the user is presented with the following messages on the window.







Please share this article -

Facebook Google Pinterest Reddit Tumblr Twitter



< Prev
Next >
< Filters
Filters Init Parameters >
Please subscribe our social media channels for notifications, we post a new article everyday.

Decodejava Google+ Page Decodejava Facebook Page  DecodeJava Twitter Page

Coming Next
-
C++ and Python

Ad2