Filter(过滤器技术),常用于web开发中对web资源,如JSP,Servlet,静态图片等进行过滤、拦截的作用。通过过滤器可实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Filter开发步骤:
1、创建java类实现Filter接口,并创建doFilter方法。
2、在web.xml文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。
Filter实施原理:
在提交request请求到JSP中间,创建一个Filter类,界面提交的任何请求,均通过Filter先进行过滤,再提交到JSP中,执行相应操作。
Filter应用实例——JSP字符集设置:
在DRP系统中,为防止界面乱码,每个JSP页面在提交的时,都会在服务端代码里写上编码格式,如Request.setCharacterEncoding("GB18030");其调用流程如下:
浏览器向Tomcat提交请求,服务器创建HttpServletRequest、HttpServletReseponce对象,传到JSP页面中,页面通过设置字符集Request.setCharacterEncoding("GB18030")取得表单参数。
这样做的唯一特点就是:一行代码,不断重复;也就是程序有多少个JSP页面,就会重复多少次Request.setCharacterEncoding("GB18030");
利用Filter过滤器实现设置字符集操作:
1、创建CharSetEncodingFilter类,实现Filter接口,同时编写doFilter方法
public class CharSetEncodingFilter implements Filter { //private String encoding; //通过encoding参数在配置文件中设定具体编码值 public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //设置字符集 request.setCharacterEncoding("GB18030"); //1、具体值 //request.setCharacterEncoding("encoding"); //2、获取配置文件中的encoding值,以传参的形式获取 //继续执行,有filter就调用别的filter,没有就直接传表单到jsp chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { //this.encoding=filterConfig.getInitParameter("encoding"); //初始化,获得encoding参数值 }
2、在web.xml文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。
<filter> <filter-name>CharSetEncodingFilter</filter-name> <filter-class>com.drp.util.CharSetEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> 通过encoding配置字符集类型 ,也可通过直接<filter-name> </init-param> </filter> <filter-mapping> <filter-name>CharSetEncodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>其中,在Web.xml文件中配置Filter的作用范围有如下几个常用配置:
<url-pattern>*.jsp</url-pattern>对所有的JSP进行过滤
<url-pattern>/servlet/*</url-pattern>对servlet文件夹下的JSP进行过滤
<url-pattern>/*</url-pattern>对所有文件进行过滤
<url-pattern>*.jsp</url-pattern>
Filter在应用中的优势:通过在Filter中进行设置,过滤验证提交的表单,通过的才传给JSP,不管提交多少个表单,在Filter这一层统统进行过滤验证,一劳永逸。并且,Filter过滤服务在表单和JSP之间独立存在着,与两者均不存在耦合关系,只通过Servlet进行初始化创建,所以不仅可以多个叠加建立,以Filter链的形式,创建多层防护,而且还可热插拔,要或不要都显得易操作好处理;