J2EE学习笔记 filter过滤器

概念

Filter就像一个一个哨卡,用户的请求需要经过Filter
并且可以有多个过滤器

Filter概念

例子:用filter来看看用户访问了哪些网页:

package filter;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstFilter implements Filter{

	public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)
		throws IOException,ServletException{
		HttpServletRequest request=(HttpServletRequest)req;
		HttpServletResponse response=(HttpServletResponse)res;
		
		String ip=request.getRemoteAddr();
		String url=request.getRequestURL().toString();
		
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d = new Date();
		String date=sdf.format(d);
		System.out.printf("%s %s 访问了 %s%n", date, ip, url);
		chain.doFilter(request, response);
	}
	public void init(FilterConfig arg0) throws ServletException{
		
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

可以看到是继承了Filter接口的,里面有三个方法。

doFilter要注意参数是ServletRequest和ServletResponse,和之前的HttpServletRequest不一样,所以不能调用之前的request的方法,所以一般会将参数rqu和res转换成request和response来使用。

init方法就是自启动,和之前servlet需要配置自启动不一样,filter一定会随着tomcat 的启动而自启动。

还有救是web.xml里面的配置,<url-pattern>/*</url-pattern>,里面的url就代表哪些页面需要filter一下。和之前servlet的配置类似的。但是要小心,一旦写错一点点,连tomcat都打不开了,就是整个项目都无法运行。也就是说一旦filter启动失败,整个web项目都无法启动。

filter解决中文处理问题

之前servlet学习的时候会用上

request.setCharacterEncoding("UTF-8");

来处理中文问题,但是麻烦在需要在每一个servlet里面添加这句话。但是根据上面提到的filter特性,如果通过filter进行了中文处理,那所有的servlet都不用在单独写了。会方便很多。

filter处理登录验证

和处理中文问题一一,我们也可以用filter一次性的处理登录验证问题,只需要写好一个filter就行。

需要注意的是,要特别判断一下,如果本来就在登录界面,那就不需要验证了。还有就是没登录也能显示图片和布局,那么css和js也需要特判一下,不会被filter拦截。

package filter;
  
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
  
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
public class AuthFilter implements Filter {
  
    @Override
    public void destroy() {
  
    }
  
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
  
        String uri = request.getRequestURI();
         
        //如果访问的资源是以css或者js结尾的,那么就不需要判断是否登录
        if (uri.endsWith(".css") || uri.endsWith(".js")) {
            chain.doFilter(request, response);
            return;        
        }
         //如果正在登录页面,那也不用判断是否登录
        if (uri.endsWith("login.html") || uri.endsWith("login")) {
            chain.doFilter(request, response);
            return;
        }
         
        String userName = (String) request.getSession().getAttribute("userName");
        if (null == userName) {
            //如果没有用户名就跳转到登录页面去。
            response.sendRedirect("login.html");
            return;
        }
  
        chain.doFilter(request, response);
    }
  
    @Override
    public void init(FilterConfig arg0) throws ServletException {
  
    }
  
}

学习网站:https://how2j.cn/p/4644

发布了82 篇原创文章 · 获赞 21 · 访问量 7943

猜你喜欢

转载自blog.csdn.net/qq_41658124/article/details/104476844