作用:
(1)可以对请求进行拦截并处理,例如:访问某些网页时,先可以判断是否登录了,没登录则拦截并跳登录页,登录则跳正常网页;
(2)可以对用户的响应进行一些处理,再将请求和响应交给目标资源。
一、Filter使用:
1.写一个java类实现Filter接口,并重写doFilter方法:
public class LoginFilter implements Filter {
public LoginFilter() {
}
// 该方法在服务器启动时执行
@Override
public void init(FilterConfig fConfig) throws ServletException {
fConfig.getInitParameter("参数名");// 得到参数值
fConfig.getInitParameterNames();// 得到web.xml中所有init标签中的参数名称,返回Enumeration集合
}
// 拦截方法,FilterChain为过滤器链
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 1.拦之前执行的代码
request.setCharacterEncoding("UTF-8"); // 例:设置采用的编码,或者判断有无登录,没登录则跳到登录页
String token = request.getParameter("token"); // 例:获取客户端上传的登录token
if (token == null || token.trim().equals("")) {
// 没登录则跳登录页,不执行后面代码
return;
}
// 2.调用这句让目标资源执行,不调用就不执行目标资源及下一个Filter。调用后会调用链中下一个Filter,如果没有下一个Filter则调用目标资源
chain.doFilter(request, response);
// 3.拦之后执行的代码
}
// 该方法在服务器停止时执行
@Override
public void destroy() {
}
}
2.在web.xml中注册:
<!-- 注册Filter -->
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.yyh.hkw.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<!-- 拦截所有的请求 -->
<url-pattern>/*</url-pattern>
<!-- 拦截级别
REQUEST:所有请求都拦截
FORWARD:转发请求拦截
INCLUDE:包含页面时拦截
ERROR:页面出错,发生跳转拦截
ASYNC:异步时拦截
-->
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
二、对返回客户端的内容gzip压缩处理:
/**
* 对返回客户端的内容gzip压缩处理
*/
private void gzip(HttpServletResponse response, String text) throws IOException {
response.setHeader("Content-Encoding", "gzip");
ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(bout);
gout.write(text.getBytes());
gout.close();
byte gzip[] = bout.toByteArray();
response.setHeader("Content-lenght", "" + gzip.length);
response.getOutputStream().write(gzip);
}