Filter

来源:互联网 发布:怎么申请淘宝儿童模特 编辑:程序博客网 时间:2024/05/17 23:43

Filter主要对用户的请求进行预处理,也可以对HttpServletResponse进行后处理。主要流程:Filter对用户的请求进行预处理,然后交给Servlet进行处理并生成响应,最后Filter再对服务器响应做后处理。
Filter的作用:

  • 用户授权的Filter:Filter负责检查用户请求,过滤用户的非法请求。
  • 日志Filter:详细记录某些特殊用户的请求。
  • 负责解码Filter:包括对非标准编码的请求解码。
  • 改变XML内容的XSLT Filter等。
  • Filter可负责拦截多个请求或响应;一个请求或响应可以被多个Filter拦截。

Filter类

创建Filter要实现javax.servlet.Filter的接口,其中有三个方法:

  • void init(FilterConfig config) 进行初始化
  • void destory()用于Filter销毁前,一些资源的回收
  • void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 实现过滤功能

配置Filter

配置Filter和Servlet非常相似,都需要配置Filter名和Filter拦截URL的模式
配置Filter有两种方式:

  • Filter类中通过注解来进行配置
  • 在web.xml文件中通过配置文件来进行配置

一个过滤的例子
这里写图片描述
AuthorityFilter.java

package filter;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.annotation.WebInitParam;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;//配置Filter,方法一:注解配置@WebFilter(filterName = "filter",           urlPatterns={"/*"},           initParams={           @WebInitParam(name="encoding",value="UTF-8"),           @WebInitParam(name="loginPage",value="/login.jsp"),           @WebInitParam(name="proLogin",value="/proLogin.jsp")           })public class AuthorityFilter implements Filter {    //用于访问Filter的配置信息   private FilterConfig config;   //初始化方法   public void init(FilterConfig config){       this.config = config;      }   //销毁方法   public void destroy(){       this.config = null;   }   //核心方法   public void doFilter(ServletRequest request,           ServletResponse response, FilterChain chain)           throws IOException,ServletException   {          //获取Filter配置参数       String encoding = config.getInitParameter("encoding");       String loginPage = config.getInitParameter("loginPage");       String proLogin = config.getInitParameter("proLogin");       //设置request编码用的字符集       request.setCharacterEncoding(encoding);       HttpServletRequest requ = (HttpServletRequest) request;       HttpSession session = requ.getSession(true);       //获取请求页面       String requestPath = requ.getServletPath();       if(session.getAttribute("user") == null && !requestPath.endsWith(loginPage)               && !requestPath.endsWith(proLogin)){           request.getRequestDispatcher(loginPage).forward(request, response);       }       else{           chain.doFilter(request,response);       }   }}

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">  <display-name>filter</display-name>  <servlet>    <description>JAX-RS Tools Generated - Do not modify</description>    <servlet-name>JAX-RS Servlet</servlet-name>    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>JAX-RS Servlet</servlet-name>    <url-pattern>/jaxrs/*</url-pattern>  </servlet-mapping>  <!--web.xml配置Filer-->  <filter>    <!--Filter的名字-->    <filter-name>filter</filter-name>    <!--Filter类-->    <filter-class>filter.AuthorityFilter</filter-class>    <!--Filter参数的值-->    <init-param>       <param-name>encoding</param-name>       <param-value>UTF-8</param-value>    </init-param>    <init-param>       <param-name>loginPage</param-name>       <param-value>/login.jsp</param-value>    </init-param>    <init-param>       <param-name>proLogin</param-name>       <param-value>/proLogin.jsp</param-value>    </init-param>  </filter>  <!--Filter拦截的模式-->  <filter-mapping>       <filter-name>filter</filter-name>       <url-pattern>/*</url-pattern>  </filter-mapping></web-app>

这里写图片描述
这里写图片描述

1 0
原创粉丝点击