How to Use Filter in Servlet 3 with @WebFilter Annotation
January 14, 2015
@WebFilter Annotation has been introduced in Java EE 6. It defines different element like filterName, asyncSupported and servletNames etc. @WebFilter cannot be used without web.xml because @WebFilter does not define order. @WebFilter reduces the other configuration in web.xml.
@WebFilter
@WebFilter annotation declares a filter. The servlet container processes a filter at deployment time and associates to the specified URL, servlet and dispatcher. It does not defines order.asyncSupported: It supports asynchronous operation in filter.
dispatcherTypes: It associates a dispatcher to a filter.
filterName: Defines a filter name.
initParams: Initialization parameter to the filter.
servletNames: Defines servlet to which the filter will be applied.
urlPatterns: Defines URL pattern.
@WebFilter Does Not Define the Order of Filter
@WebFilter has no element to define the order of filter of execution. We need to define order in web.xml. This may be because if we decide order of filter at class level using @WebFilter, then what if we include third party library which has filter with same order.Example for @WebFilter with web.xml
Now find the example of @WebFilter. We are creating two filter and a servlet. The order of filter will be defined in web.xml. Find the filter one.FilterOne.java
package com.concretepage; 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; import javax.servlet.annotation.WebFilter; @WebFilter(filterName="filterOne") public class FilterOne implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Inside filter one."); chain.doFilter(request, response); } @Override public void destroy() { } }
FilterTwo.java
package com.concretepage; 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; import javax.servlet.annotation.WebFilter; @WebFilter(filterName="filterTwo") public class FilterTwo implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Inside filter two."); chain.doFilter(request, response); } @Override public void destroy() { } }
<?xml version="1.0" encoding="ISO-8859-1" ?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="3.0"> <display-name>Filter Demo</display-name> <filter-mapping> <filter-name>filterOne</filter-name> <url-pattern>/msg/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>filterTwo</filter-name> <url-pattern>/msg/*</url-pattern> </filter-mapping> </web-app>
HelloWorldServlet.java
package com.concretepage; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns = "/msg/HelloWorldServlet", loadOnStartup = 1) public class HelloWorldServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{ doGet(request,response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{ response.setContentType("text/html"); System.out.println("Inside servlet."); PrintWriter out = response.getWriter(); out.println("Hello World!"); } }
Output
To run the demo deploy the war file and access URLhttp://localhost:8080/ServletDemo-1/msg/HelloWorldServlet
We will get output in console as below.
Inside filter one. Inside filter two. Inside servlet.