概念
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 {
}
}