Filter常见应用
l 统一全站字符编码的过滤器
• 通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题
public class CharSetEncodingFilter implements Filter {
private FilterConfig filterConfig;
public void destroy() {
// TODO Auto-generatedmethod stub
}
private String defaultCharset="utf-8";
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
// TODO Auto-generatedmethod stub
//设置请求对象
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse rep=(HttpServletResponse)response;
String charset=filterConfig.getInitParameter("encoding");//得到初始化参数
if(charset==null){
charset=defaultCharset;
req.setCharacterEncoding(charset);
}
request.setCharacterEncoding(charset);
req.setCharacterEncoding(charset);
rep.setContentType("text/html;charset="+charset);//设置应答内容的类型
chain.doFilter(req, rep);
}
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generatedmethod stub
this.filterConfig=filterConfig;
}
}
<filter>
<filter-name>CharsetEncodeFilter</filter-name>
<filter-class>com.hbsi.web.filter.CharSetEncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
l 禁止浏览器缓存所有动态页面的过滤器:
• 有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:
• response.setDateHeader("Expires",-1);
• response.setHeader("Cache-Control","no-cache");
• response.setHeader("Pragma","no-cache");
• 并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。
• Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面
• Cache-Control响应头有两个常用值:
• no-cache指浏览器不要缓存当前页面。
• max-age:xxx指浏览器缓存页面xxx秒。
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
// TODO Auto-generatedmethod stub
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
//让浏览器不缓存页面
res.setDateHeader("Expires",-1);//将整数值转换为日期类型,-1代表不缓存
res.setHeader("Cache-Control", "no-cache");
res.setHeader("Pragma", "no-cache");
chain.doFilter(req, res);
}
<servlet-mapping>
<servlet-name>NoCacheFilter</servlet-name>
<url-pattern>/servlet/NoCacheFilter</url-pattern>
</servlet-mapping>
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>com.hbsi.web.filter.NoCacheFilter</filter-class>
</filter>
l 控制浏览器缓存页面中的静态资源的过滤器:
• 场景:有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。
public class ExpiresFilter implements Filter {
public void destroy() {
// TODO Auto-generatedmethod stub
}
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
// TODO Auto-generatedmethod stub
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
//(1)得到请求的是什么资源? js css jpg
String uri=req.getRequestURI();
if(uri.endsWith(".css")){//判断字符串是否是以.css结尾
//120单位是秒。乘以1000换算成毫秒
//System.currentTimeMillis()获取的是从1970年1月1日0点0分到现在所经历的毫秒数
long expiresTime=Integer.parseInt(fileConfig.getInitParameter("css"))*1000;
//设置页面失效的日期
res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);
}else if(uri.endsWith(".js")){
long expiresTime=Integer.parseInt(fileConfig.getInitParameter("js"))*1000;
//设置页面失效的日期
res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);
}else if(uri.endsWith(".jpg")){
long expiresTime=Integer.parseInt(fileConfig.getInitParameter("jpg"))*1000;
//设置页面失效的日期
res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);
}
chain.doFilter(req,res);
}
private FilterConfig fileConfig;
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generatedmethod stub
this.fileConfig=fileConfig;
}
}
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>com.hbsi.web.filter.ExpiresFilter</filter-class>
<init-param>
<param-name>css</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>jsp</param-name>
<param-value>180</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>*.jpg</url-pattern>
</filter-mapping>

被折叠的 条评论
为什么被折叠?



