(1) 请求信息编码转化的Filter
importjava.io.IOException;
importjava.util.Enumeration;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
public class EncodeFilter implementsFilter{
private FilterConfig filterConfig=null;
private String encoding=null;
//默认构造函数
public EncodeFilter(){
}
//初始化过滤器
public void init(FilterConfig filterConfig)throwsServletException{
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
}
//得到编码
private String getEncoding(){
return this.encoding;
}
//执行过滤操作
public void doFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainfilterChain)throws
IOException,ServletException{
//设置编码格式
if(request.getCharacterEncoding()==null){
//从配置文件得到编码
String encoding=getEncoding();
//设置编码
if(encoding!=null){
request.setCharacterEncoding(encoding);
}
//传递过滤器
filterChain.doFilter(request,response);
}
}
public void destroy(){
filterConfig=null;
encoding=null;
}
}
web.xml文件配置
<filter>
<filter-name>SetEncodingFilter</filter-name>
<filter-class>cn.mblogger.mydeman.EncodeFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(2) 检测用户是否登陆的过滤器
/**
用于检测用户是否登陆的过滤器,如果未登录,则重定向到指的登录页面
checkSessionKey 需检查的在 Session 中保存的关键字
*/
public class CheckLoginFilter implements Filter {
protected FilterConfig filterConfig = null;
private String redirectURL = null;
private String sessionKey = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
redirectURL = filterConfig.getInitParameter("redirectURL");
sessionKey = filterConfig.getInitParameter("checkSessionKey");
}
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
if (session.getAttribute(sessionKey)!=null) {//如果已经登录了,执行其它的Filter
//filterChain.doFilter(request, response); 继续下一个过滤器
request.getRequestDispatcher("/admin/index.jsp");
return;
} else {
response.sendRedirect("/login.jsp");
}
}
public void destroy(){
}
}
对过滤链的说明
比如上面两个filter 一个是处理文字编码,一个是处理权限
1、执行EncodingFilter类doFilter()中chain.doFilter()之前的部分:request.setCharacterEncoding(encoding);
2、执行CheckLoginFilter类doFilter()中chain.doFilter()之前的部分:判断用户是否已登录。
3、如果用户已登录,则访问请求的资源:/admin/index.jsp。
4、如果用户未登录,则页面重定向到:/login.jsp。
5、执行CheckLoginFilter类doFilter()中chain.doFilter()之后的部分:执行return语句返回方法
6、执行EncodingFilter类doFilter()中chain.doFilter()之后的部分:这里也没有代码。
过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。
而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有过滤器
之前,这样才能确保在使用请求中的数据前设置正确的编码。
(3) 使浏览器不缓存页面的过滤器
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 用于的使 Browser 不缓存页面的过滤器
*/
public class ForceNoCacheFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException{
((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
((HttpServletResponse) response).setHeader("Pragma","no-cache");
((HttpServletResponse) response).setDateHeader ("Expires", -1);
filterChain.doFilter(request, response);
}
public void destroy(){
}
public void init(FilterConfig filterConfig) throws ServletException{
}
}