JavaWeb开发之Filter

1. 功能

  • 1、用来拦截传入的请求和传出的响应。
  • 2、修改或以某种方式处理正在客户端和服务端之间交换的数据流。

2. 如何使用

与使用 Servlet 类似,Filter 是 Java WEB 提供的一个接口,开发者只需要自定义一个类并且实现该接口 即可。

 
package com.southwind.filter; import javax.servlet.*;
import java.io.IOException;
public class CharacterFilter implements Filter {
@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain) throws IOException, ServletException
{
servletRequest.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest,servletResponse); }
}

web.xml 中配置 Filter

 
<filter>
<filter-name>charcater</filter-name> 
	<filter-class>com.southwind.filter.CharacterFilter</filter-class>
</filter>


<filter-mapping> 
	<filter-name>charcater</filter-name> 
	<url-pattern>/login</url-pattern> 
	<url-pattern>/test</url-pattern>
</filter-mapping>

注意:

doFilter 方法中处理完业务逻辑之后,必须添加 filterChain.doFilter(servletRequest,servletResponse);
否则请求/响应无法向后传递,一直停留在过滤器中。

3.Filter的生命周期

当 Tomcat 启动时,通过反射机制调用 Filter 的无参构造函数创建实例化对象,同时调用 init 方法实现 初始化,doFilter 方法调用多次,当 Tomcat 服务关闭的时候,调用 destory 来销Filter 对象。

无参构造函数:只调用一次,当 Tomcat 启动时调用(Filter 一定要进行配置)
init 方法:只调用一次,当 Filter 的实例化对象创建完成之后调用
doFilter:调用多次,访问 Filter 的业务逻辑都写在 Filter 中
destory:只调用一次,Tomcat 关闭时调用。

4.Filter的调用顺序

同时配置多个 Filter,Filter 的调用顺序是由 web.xml 中的配置顺序来决定的,写在上面的配置先调 用,因为 web.xml 是从上到下顺序读取的。

 
<filter>
<filter-name>my</filter-name>
	 <filter-class>com.southwind.filter.MyFilter</filter-class>
</filter>

<filter-mapping>
	 <filter-name>my</filter-name> 
	 <url-pattern>/login</url-pattern>
</filter-mapping>


<filter>
	<filter-name>charcater</filter-name>
	<filter-class>com.southwind.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
	 <filter-name>charcater</filter-name>
	 <url-pattern>/login</url-pattern> 
	 <url-pattern>/test</url-pattern>
</filter-mapping>

5. 注解优化代码

也可以通过注解的方式来简化 web.xml 中的配置

 
<filter>
<filter-name>my</filter-name> 
	<filter-class>com.southwind.filter.MyFilter</filter-class>
</filter>
<filter-mapping> 
<filter-name>my</filter-name> 
<url-pattern>/login</url-pattern>
</filter-mapping>

等同于

  
@WebFilter("/login")
public class MyFilter implements Filter {
}

6.实际开发中是用Filter

6.1、统一处理中文乱码。

6.2、屏蔽敏感词。

  
package com.southwind.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter; import java.io.IOException;
@WebFilter("/test")
public class WordFilter implements Filter {
@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain) throws IOException, ServletException
{
	servletRequest.setCharacterEncoding("UTF-8"); //将"敏感词"替换成"***"
	String name = servletRequest.getParameter("name"); 
	name = name.replaceAll("敏感词","***"); 
	servletRequest.setAttribute("name",name); 
	filterChain.doFilter(servletRequest,servletResponse);

} }
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name = (String) 
req.getAttribute("name");
System.out.println("servlet:"+name); }
}

6.3、控制资源的访问权限。

 
package com.southwind.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/download.jsp")
public class DownloadFilter implements Filter {
@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain) throws IOException, ServletException
{
	HttpServletRequest request = (HttpServletRequest) servletRequest; 	
	HttpServletResponse response = (HttpServletResponse) servletResponse; 
	HttpSession session = request.getSession();
	
	String name = (String) session.getAttribute("name");
	if(name == null){ //不是登录状态
		response.sendRedirect("/login.jsp"); }
	else{
		filterChain.doFilter(servletRequest,servletResponse); }
	} 
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值