Filter位于javax.servlet.Filter,作用是在请求到达Servlet之前和服务端返回从Servlet返回之后对消息进行拦截处理。
一.使用方法
1.实现Filter接口,重新init、destroy和doFilter方法,前两个方法一个是初始化一个是销毁,最后一个方法表示拦截的逻辑处理。
2.web.xml配置,配置和servlet配置相似,根据class配置别名,然后给这个别名配置需要拦截的servlet,*依然表示匹配所有。
实例:
<!-- 配置过滤器,后面的init表示自己定义的常量,在代码中可以获取到 -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.test.c_171030.MyFilter</filter-class>
<init-param>
<param-name>data</param-name>
<param-value>a data</param-value>
</init-param>
</filter>
<!-- 配置过滤器需要过滤的url -->
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
在这个例子中我们定义了一个常量,这个常量在代码的读取方法如下:
data=filterConfig.getInitParameter("data");
System.out.println("获取web.xml中存储的数值为:"+data);
二.使用举例
因为在doFilter方法中传入了Request和Respone对象,所以可以对请求头等部分信息进行修改。
比如:客户端请求了url+/MyServlet,现在由于需求变更,需要去请求url+/myServlet,那就需要使用如下:
1.请求转发:
HttpServletRequest request = (HttpServletRequest) servletRequest;
// 请求重定向,把之前请求/MyServelt重定向为到/myServrlt去
// request.getRequestDispatcher("/myServelt").forward(request, servletResponse);
filterChain.doFilter(request, servletResponse);
这样调用doFilter之后,收到这个请求的servlet将是/myServlet对于的servlet了
2.重定向
HttpServletResponse httpServletResponse=(HttpServletResponse) servletResponse;
// 直接拦截请求,重定向到百度或者报信息
//httpServletResponse.sendRedirect("http://www.baidu.com");
httpServletResponse.sendError(505,"服务端出线未知异常");
如果是转发,浏览器显示的地址不会改变还是原地址,如果是重定向,浏览器的地址将会是新的地址
举例:
客户端找servlet借钱,转发相当于这个servlet没有钱,它去找同项目下的其他servlet借,借到后给了客户端,客户端并不知道到底是谁的钱,所以地址栏一直显示的是servlet;
而重定向相当于servlet没有钱,它告诉客户端你去找别人吧,这个别人可以是这个项目下的其他servlet也可以是其他任意一个servlet(不管在哪,任何地方,不同工程,不同服务器都可以),然后客户端就去找这个servlet了,由于是客户端自己找这个servlet,所以浏览器的地址就变化了。