Filter一定会随着tomcat的启动自启动。
开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。
通过对filter过滤器的了解,可以得知在以下三种情况下可以做些处理:
- 通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。比如,可以在用户权限验证等等。判断用户是否有访问某些资源的权限,有权限放行,没权限不执行chain.doFilter方法。
2.通过在调用chain.doFilter方法之前,做些处理来达到某些目的。比如,解决中文乱码的问题等等。可以在doFilter方法前,执行设置请求编码与响应的编码。甚至可以对request接口进行封装装饰来处理get请求方式的中文乱码问题(重写相应的request.getParameter方法)。
3.通过在调用chain.doFilter方法之后,做些处理来达到某些目的。比如对整个web网站进行压缩。在调用chain.doFilter方法之前用类A对response对象进行封装装饰,重写getOutputStream和重写getWriter方法。在类A内部中,将输出内容缓存进ByteArrayOutputStream流中,然后在chain.doFilter方法执行后,获取类A中ByteArrayOutputStream流缓存数据,用GZIPOutputStream流进行压缩下。
配置:
<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>
在web.xml中进行filter的配置,和servlet的配置很类似
<url-pattern>/*</url-pattern>
表示所有的访问都会过滤
如果配置成
<url-pattern>*.jsp</url-pattern>
就表示只过滤jsp
例子:
那就是通过Filter过滤器进行中文处理 ,那么所有的Servlet都不需要单独处理了。
@Override
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);
}
//因为这个过滤器的存在,在登陆之前所有的资源都不能访问。 所以在login.jsp上如果有图片,js和css,也不能够正常显示和工作。这样做当然是不行的,那么如何让js css和图片文件即使在不登陆的情况下,也可以访问
@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();
if (uri.endsWith("login.html") || uri.endsWith("login")) {
chain.doFilter(request, response);
return;
}
//如果访问的资源是以css或者js结尾的,那么就不需要判断是否登录
if (uri.endsWith(".css") || uri.endsWith(".js")) {
chain.doFilter(request, response);
return;
}
String userName = (String) request.getSession().getAttribute("userName");
if (null == userName) {
response.sendRedirect("login.html");
return;
}
chain.doFilter(request, response);
}