标签:row pre close 服务器端 浏览器 request 控制 eagle margin
1. 什么是过滤器
过滤器是一个运行在服务器端的程序,先于与之相关的servlet或JSP页面之前运行实现对请求资源的过滤的功能;
过滤器可附加到一个或多个servlet或jsp页面上,可以检查请求信息也可以处理相应信息;
filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet执行前后实现一些特殊的功能。
如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。
在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:
过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。
2. 过滤器的编写流程
1 package com.eagle.web; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 public class ServletFilter extends HttpServlet { 10 11 private static final long serialVersionUID = 1L; 12 13 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 14 String name = (String) request.getAttribute("name"); 15 System.out.println("servlet获取request域中的name属性="+name); 16 response.getWriter().write("hello haohao...name="+name); 17 } 18 19 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 20 doGet(request, response); 21 } 22 }
1 package com.eagle.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.ServletException; 8 import javax.servlet.ServletRequest; 9 import javax.servlet.ServletResponse; 10 11 public class Demo1Filter implements Filter { 12 13 public Demo1Filter() { 14 15 } 16 17 public void init(FilterConfig fConfig) throws ServletException { 18 19 } 20 21 public void destroy() { 22 23 } 24 25 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 26 throws IOException, ServletException { 27 request.setAttribute("name", "filter"); 28 System.out.println("servlet之前进行调用,设置request域的name属性为filter"); 29 chain.doFilter(request, response); 30 } 31 }
1 <filter> 2 <display-name>Demo1Filter</display-name> 3 <filter-name>Demo1Filter</filter-name> 4 <filter-class>com.eagle.filter.Demo1Filter</filter-class> 5 </filter> 6 <filter-mapping> 7 <filter-name>Demo1Filter</filter-name> 8 <url-pattern>/*</url-pattern> 9 </filter-mapping>
3. 配置web.xml详解
<filter>
<filter-name>loginFilter</filter-name> //过滤器名称
<filter-class>com.x.control.loginFilter</filter-class> //过滤器类的包路径
<init—param> //可选
<param—name>参数名</param-name> //过滤器初始化参数
<param-value>参数值</param-value>
</init—pamm>
</filter>
<filter-mapping> //过滤器映射
<filter-name>loginFilter</filter-name>
<url-pattern>指定过滤器作用的对象</url-pattern>
</filter-mapping>
在配置中需要注意的有两处:
1:作用于所有web资源:<url—pattern>/*</url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。
2:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>
3:作用于某一种类型的文件:<url—pattern>*.扩展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>过滤所有对jsp文件的访问请求。
4:作用于某一文件夹下某一类型文件:<url—pattern>/dir/*.扩展名</url-pattern>
如果一个过滤器需要过滤多种文件,则可以配置多个<filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则。
标签:row pre close 服务器端 浏览器 request 控制 eagle margin
原文地址:https://www.cnblogs.com/eaglesour/p/9476370.html