Filter
拦截每个网页的请求,看看你是否登录过
一.Hello Filter
1.Filter概念
Filter就像一个一个哨卡,用户的请求需要经过Filter,并且可以有多个过滤器
用户访问--Filter1-Filter2-Filter3-->Servlet
2.编写FirstFilter
开发一个简单的FirstFilter
public class FirstFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request =(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) res;
//浏览器所处的客户机的ip地址
String ip=request.getRemoteAddr();
//浏览器发送请求的资源名部分,去掉协议和主机名
String url=request.getRequestURI().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);
//过滤器放行,表示继续运行下一个过滤器,或者最终访问的某个servlet,jsp,html等
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("First Filter init()");
}
}
3.配置web.xml
filter>
<filter-name>FirstFilter</filter-name>
<filter-class>filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.访问页面
5.init()方法
与Servlet需要配置自启动才会随着tomcat的启动而执行init()方法不一样
Filter一定会随着tomcat的启动自启动
6.Filter启动失败
Filter是web应用非常重要的一个环节,如果Filter启动失败,或者本身有编译错误,不仅这个Filter不能使用,整个web应用会启动失败,导致用户无法访问页面
在启动tomcat过程中,也会看到这样的字样:
严重: Context [] startup failed due to previous errors
二.中文处理
1.使用Servlet处理的局限性
在通过Servlet获取中文参数 的章节中知道,可以通过 request.setCharacterEncoding("UTF-8");
正确获取UTF-8编码的中文,但是如果有很多servlet都需要获取中文,那么就必须在每个Servlet中增加这段代码。有一个简便的办法,通过Filter过滤器进行中文处理 ,所有的Servlet都不需要单独处理了。
2.使用Filter处理
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
3.配置web.xml
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.测试
三.登录验证
1.在Servlet中进行登陆验证的局限性
我们可以通过在HeroListServlet中增加对session的判断代码来做到登录验证,但是按照这样的做法,所有的Servlet都要加上一样的代码,通过Filter一次性解决所有的登录验证的问题
//如果访问的资源是以css或者js结尾的,那么就不需要判断是否登录
if (uri.endsWith(".css") || uri.endsWith(".js")) {
chain.doFilter(request, response);
return;
}