Servlet Learning Notes (vii)--Custom Filter Authoring improvements: Customizing Implementation Filterchain

Source: Internet
Author: User
Tags stub

Note Six implemented three kinds of filters: character encoding filtering, login rights filtering, sensitive word filter, but there is a flaw is that the filter order, but not the implementation of Advanced line request filter, and finally response filter, and the middle of a number of filter sequence can not be changed dynamically. So here's an improvement to implement a filter order Filterchain.

The order in which multiple filters are executed is carefully explained in this blog post, which concludes that the sequence of execution of multiple filter sequences is performed according to the order of <filter-mapping> in Web.xml, such as:

<?xml version= "1.0" encoding= "UTF-8"?> <web-app version= "2.5" xmlns= "Http://java.sun.com/xml/ns/javaee"    
    Xmlns:xsi= "Http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation= "Http://java.sun.com/xml/ns/javaee Http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd "> <welcome-file-list> <welcome-file>ind ex.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>firstfil Ter</filter-name> <filter-class>com.test.filter.FirstFilter</filter-class> </filter > <filter> <filter-name>secondFilter</filter-name> <filter-class>c om.test.filter.secondfilter</filter-class> </filter> <filter-mapping> <filte R-name>secondfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping > <filter-mApping> <filter-name>firstFilter</filter-name> <url-pattern>/*</url-pattern&   
    Gt   
        </filter-mapping> <servlet> <servlet-name>firstServlet</servlet-name> <servlet-class>com.alimama.servlet.FirstServlet</servlet-class> </servlet> <servlet -mapping> <servlet-name>firstServlet</servlet-name> <url-pattern>/firstservlet&    Lt;/url-pattern> </servlet-mapping> </web-app>

The secondfilter will be executed before the firstfilter is executed.

The following is an intercept of the Dofilter code that implements the filter interface: the user-defined filter implements the interface.

public void Dofilter (ServletRequest request, servletresponse response,   
            Filterchain chain) throws IOException, servletexception {   
        System.out.println ("Before Invoke Secondfilter ' Chain.dofilter () ...");   
        Chain.dofilter (request, response);   
        System.out.println ("After invoke Secondfilter ' s chain.dofilter ().");   
    }   

You can see the fourth line of Chain.dofilter (Request,response), which is the core of the filter technology in the servlet, whose primary function is to pass the request to the next filter. Not all of a sudden all the filter objects are initialized.

Based on this idea, I have defined a filterchain to implement the filter order of multiple filters.

Filterchain.java
package Lewa;

Import Javax.servlet.ServletRequest;
Import Javax.servlet.ServletResponse;

public class Filterchain {
	//private static final string[] filters={"Loginfilter", "Wordfilter"};
	private static final filter[] Filters={new loginfilter (), New Wordfilter ()};
	private static int count=0;
	public void Dofilter (ServletRequest request,servletresponse Response,filterchain FC) throws Instantiationexception, Illegalaccessexception, exception{
		if (count<filters.length) {	
			//class<filter> cls= (Class< filter>) Class.forName (Filters[count]);
			Cls.dofilter (request, response);
			Filters[count++].dofilter (Request, response, FC);}}

The order of the filter instances in the static member variable filters can be defined by itself, and you may want to change the filter order as long as you alter the string array.

The corresponding other filter has also been changed:

Filter.java
package Lewa;

Import Javax.servlet.ServletRequest;
Import Javax.servlet.ServletResponse;

Public interface Filter {public
	void init ();
	public void Dofilter (ServletRequest reuqest,servletresponse Response,filterchain FC) throws Exception;
	public void Destroy ();
}

Encodingfilter.java
package Lewa;

Import java.io.IOException;

Import javax.servlet.ServletException;
Import Javax.servlet.ServletRequest;
Import Javax.servlet.ServletResponse;

public class Encodingfilter implements filter{

	@Override public
	void init () {
		//TODO auto-generated method s Tub
		
	}

	@Override public
	void Dofilter (ServletRequest reuqest, Servletresponse Response,filterchain FC) Throws Instantiationexception, Illegalaccessexception, exception{
		//TODO auto-generated method stub
		Reuqest.setcharacterencoding ("UTF-8");
		Fc.dofilter (Reuqest, RESPONSE,FC);
		Response.setcontenttype ("Text/html;charset=utf-8");
	}

	@Override public
	Void Destroy () {
		//TODO auto-generated method stub		
	}
	
}

Loginfilter.java Package Lewa;
Import Javax.servlet.ServletRequest;
Import Javax.servlet.ServletResponse;
Import Javax.servlet.http.HttpServletRequest;
Import Javax.servlet.http.HttpServletResponse;

Import javax.servlet.http.HttpSession; public class Loginfilter implements filter{public Loginfilter () {} @Override public void init () {//TODO Auto-gener
			Ated method stub} @Override public void Dofilter (ServletRequest reuqest, Servletresponse Response,filterchain FC)
		Throws Exception {//TODO auto-generated method Stub httpservletrequest req= (HttpServletRequest) reuqest;
		HttpServletResponse resp= (httpservletresponse) response;
		HttpSession session=req.getsession ();
		if (Session.getattribute ("username") ==null) {resp.sendredirect ("login.html"); }else{Fc.dofilter (Reuqest, RESPONSE,FC);//There must be an else here, not directly to execute the next filter, because if you do not log in, then the sensitive word filter does not have to do, and you can try not to add else, you will find that 
                Before landing the message will jump to the login interface, landing and then back to the message interface, this time count has not satisfied count<filters.length, so the sensitive word filter will not be implemented.

}
	}	@Override public void Destroy () {//TODO auto-generated method stub}}
 

Wordfilter.java Package Lewa;
Import java.io.IOException;
Import Java.io.InputStream;
Import java.util.Enumeration;
Import java.util.Properties;
Import Java.util.regex.Matcher;

Import Java.util.regex.Pattern;
Import Javax.servlet.ServletRequest;

Import Javax.servlet.ServletResponse;
	public class Wordfilter implements filter{private static pattern pattern=null;
	
	public static String Str=null;
		private void Loadkeywordproperties () {StringBuffer patternbuffer = new StringBuffer ();
			try{InputStream in =wordfilter.class.getclassloader (). getResourceAsStream ("words.properties");
			Properties Properties = new properties ();
			Properties.load (in);
			Enumeration<?> Enu=properties.propertynames ();
			while (Enu.hasmoreelements ()) {Patternbuffer.append ((String) enu.nextelement () + "|");}
			Patternbuffer.deletecharat (Patternbuffer.length ()-1);
		Pattern = Pattern.compile (new String (Patternbuffer.tostring (). GetBytes ("Iso-8859-1"), "UTF-8"));
			}catch (IOException e) {E.printstacktrace (); @Override public void init () {//TODO auto-generated a stub} @Override public void Dofilter (Servlet Request reuqest, Servletresponse Response,filterchain FC) throws Instantiationexception, Illegalaccessexception, EXCEP
		tion {//TODO auto-generated Method Stub loadkeywordproperties ();
		Str=reuqest.getparameter ("Liuyan");
			try{Matcher m=pattern.matcher (str);
		Str=m.replaceall ("* *");
		}catch (Exception e) {e.printstacktrace ();
	} fc.dofilter (Reuqest, RESPONSE,FC);
 @Override public void Destroy () {//TODO auto-generated method stub}}

Code changes in the last servlet:

Package Lewa;
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;

Import javax.servlet.http.HttpSession; /** * Servlet Implementation Class Summary/public class Summary extends HttpServlet {private static final long Seri
       
    Alversionuid = 1L;
        /** * @see httpservlet#httpservlet () * * * Public Summary () {super (); TODO auto-generated Constructor stub}/** * @see httpservlet#doget (httpservletrequest request, HTTPSERVLETRESP Onse response) */protected void doget (HttpServletRequest request, httpservletresponse response) throws Servletexceptio N, IOException {//TODO auto-generated Method stub}/** * @see httpservlet#dopost (httpservletrequest request, HTT Pservletresponse response) */protected void DoPost (HttpServletRequest request, HttpservletresponSE response) throws Servletexception, IOException {//TODO auto-generated method stub Filter filter=new Encodingfilte
		R ();
		Filterchain fc=new Filterchain ();
		try {filter.dofilter (request, RESPONSE,FC);
		catch (Exception e) {//TODO auto-generated catch block E.printstacktrace ();
		} printwriter Out=response.getwriter ();
		HttpSession session=request.getsession ();
		String Name= (String) Session.getattribute ("username"); if (name!=null&&! "".
		Equals (name)) {name=new String (name.getbytes ("iso-8859-1"), "UTF-8");
		} out.println (" 

Custom filter chain to write this is the source of the download address.

I hope we can teach you a lot ~ ~



Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.