Java过滤器是实现了javax.servlet.Filter接口的java类。
用途:
提出问题:
我们知道为了避免提交数据的乱码问题,需要在每次使用请求之前设置编码格式。在你复制粘贴了无数次request.setCharacterEncoding(“gb2312”);后有没有想要一劳永逸的方法呢?能不能一次性修改所有请求的编码呢?
解决问题:
过滤器可拦截请求,在执行其它web组件(如:jsp,servlet等)之前执行; (这样可以利用过滤器设置请求对象的字符集,权限控制等) 。常用作(编码设置,权限控制,论坛脏话过滤,登陆和审核过滤,加密过滤,图像转换过滤,数据压缩过滤,认证过滤)
过滤器是一个程序,它先于与之相关的servlet或jsp页面运行在服务器上。过滤器可附加到一个或多个servlet或
jsp页面上,并且可以检查进入这些资源的请求信息
视图 :
先:客户端---->过滤链----->服务端
后:服务端------>过滤链----->客户端(和上面反向)
过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请 求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之 前,这样才能确保在使用请求中的数据前设置正确的编码。
过滤器的方法:
public void init(FilterConfig filterConfig) throws ServletException { }
public void destroy() {}
public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException,
ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();
PrintWriter out = response.getWriter();
if (session.getAttribute("username") == null) {
// 没登录,回到login.html
String message = "你还未登录,或者会话已超时";
String url = request.getContextPath() + "/login.html";
out.println("<script>alert('" + message
+ "');window.location.href='" + url + "';</script>");
} else {
chain.doFilter(request, response);
}
}
配置:
老的
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.sato.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注释: 只过滤客户端请求服务端时发生(如重定向),在服务端之间并没有发生(如转发)
新的
在servlet-2.3中,Filter会过滤一切请求,包括服务器内部使用forward转发请求和<%@ include file=“/index.js p”%>的情况。到了servlet-2.4中Filter默认下只拦截外部提交的请求,forward和include这些内部转发都不会被过 滤,但是有时候我们需要forward的时候也用到Filter,这样就需要如下配置:
<filter>
<filter-name>TestFilter</filtername>
<filter-class>anni.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filtername>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>EXCEPTION</dispatcher>
</filter-mapping>
URL-Pattern的配置
<url-pattern>/*</url-pattern> 匹配所有的
<url-pattern>*.do</url-pattern> 匹配指定格式的
<url-pattern>/TeServlet1</url-pattern> 匹配TeServlet 路径下的
注意:过滤器只过滤地址栏上的又相关的匹配的地址