filter java 是单例的吗_Java Web总结十九Filter过滤器

一、Filter简介

Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:例如Jsp,Servlet,静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、自动登录、压缩响应信息等一些高级功能。

Servlet

API中提供了一个Filter接口,开发Web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

8217fe4c2cfa4a978323ee8bd37d6e79.png

二、Filter开发步骤

1、编写Java类实现Filter接口,并实现doFilter方法。

2、在Web.xml文件中使用和元素对编写的Filter类进行注册,并设置它所能拦截的资源。

三、Filter链

1、在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为Filter链。

2、Web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有Filter,如果有,则调用第2个Filter,如果没有,则调用目标资源。

四、过滤器生命周期

空参构造() 1次

init() 1次

doFilter(请求,响应,过滤器链) N次,与请求次数有关

destory() 1次

Filter是一个单例

五、使用Filter读取配置文件信息

1、web.xml

fcecaa27ea5212ceb9bf034c36bfbf34.gif

FilterDemo4

com.gnnuit.web.filter.FilterDemo4

encoding

UTF-8

FilterDemo4

/*

fcecaa27ea5212ceb9bf034c36bfbf34.gif

2、FilterDemo4.java

fcecaa27ea5212ceb9bf034c36bfbf34.gifpackagecom.gnnuit.web.filter;importjava.io.IOException;importjava.util.Enumeration;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;//使用FilterConfig读取配置文件的信息

public class FilterDemo4 implementsFilter {privateFilterConfig filterConfig;

@Overridepublic voiddestroy() {//TODO Auto-generated method stub

}

@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {//方式一:读取一个

String encoding = filterConfig.getInitParameter("encoding");

response.setContentType("text/html;charset=" +encoding);//方式二:读取多个

Enumeration enums =filterConfig.getInitParameterNames();while(enums.hasMoreElements()) {

String key=enums.nextElement();

String value=filterConfig.getInitParameter(key);

System.out.println(key+ ":" +value);

}

chain.doFilter(request, response);

}

@Overridepublic void init(FilterConfig filterConfig) throwsServletException {this.filterConfig =filterConfig;

}

}

fcecaa27ea5212ceb9bf034c36bfbf34.gif

五、Filter应用

1、统一Post请求中文字符编码的过滤器。(通过配置参数encoding指明使用何种字符编码,以处理表单form请求参数的中文问题)

(1)web.xml

fcecaa27ea5212ceb9bf034c36bfbf34.gif

FilterDemo5

com.gnnuit.web.filter.FilterDemo5

encoding

UTF-8

FilterDemo5

/*

fcecaa27ea5212ceb9bf034c36bfbf34.gif

(2)FilterDemo5.java

fcecaa27ea5212ceb9bf034c36bfbf34.gifpackagecom.gnnuit.web.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;//post请求中文字符编码的过滤器

public class FilterDemo5 implementsFilter {privateFilterConfig filterConfig;

@Overridepublic voiddestroy() {//TODO Auto-generated method stub

}

@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {//设置post请求编码

request.setCharacterEncoding("utf-8");//设置输出编码

String encoding = filterConfig.getInitParameter("encoding");

response.setContentType("text/html;charset=" +encoding);

chain.doFilter(request, response);

}

@Overridepublic void init(FilterConfig filterConfig) throwsServletException {this.filterConfig =filterConfig;

}

}

fcecaa27ea5212ceb9bf034c36bfbf34.gif

2、禁止浏览器缓存所有动态页面的过滤器

(1)web.xml

fcecaa27ea5212ceb9bf034c36bfbf34.gif

FilterDemo6

com.gnnuit.web.filter.FilterDemo6

encoding

UTF-8

html

86400

FilterDemo6

/*

fcecaa27ea5212ceb9bf034c36bfbf34.gif

(2)FilterDemo6.java

fcecaa27ea5212ceb9bf034c36bfbf34.gifpackagecom.gnnuit.web.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;//禁止浏览器缓存所有动态资源[例如JSP资源]//浏览器缓存所有静态资源,并指定缓存时间[例如html资源]

public class FilterDemo6 implementsFilter {privateFilterConfig filterConfig;

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {

HttpServletRequest httpRequest=(HttpServletRequest) request;

HttpServletResponse httpResponse=(HttpServletResponse) response;

String uri=httpRequest.getRequestURI();if (uri != null && uri.endsWith("jsp")) {

httpResponse.setHeader("expires", "-1");

httpResponse.setHeader("cache-control", "no-cache");

httpResponse.setHeader("pragma", "no-cache");

}else if (uri != null && uri.endsWith(".html")) {

String strHtml= filterConfig.getInitParameter("html");long time = System.currentTimeMillis() +Integer.parseInt(strHtml)* 1000;//time为毫秒值

httpResponse.setDateHeader("expires", time);

httpResponse.setHeader("cache-control", time / 1000 + "");

httpResponse.setHeader("pragma", time / 1000 + "");

}

chain.doFilter(request, response);

}

@Overridepublic void init(FilterConfig filterConfig) throwsServletException {this.filterConfig =filterConfig;

}

}

fcecaa27ea5212ceb9bf034c36bfbf34.gif

原文:http://www.cnblogs.com/FlySheep/p/3728785.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值