Servlet分为三种:标准的Servlet----MVC中控制器 、过滤Servlet(过滤器)、监听Servlet(监听器)。
这篇博客将结合实例来讲解过滤Servlet(过滤器)。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过过滤器,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。
过滤器一般是在开发之后加入到Web工程,过滤器的功能:
1,判断是否是非法用户(判断session是否存在属性)
2,屏蔽非法文字(反动、骂人之类的敏感词)
3,对请求的内容进行统一的编码
判断非法用户应该是最最常用的了,很多网站都会进行筛选,对于未登录的用户,某些特定的模块或者功能不能进行访问或者操作,那么它是如何实现的呢?
首先在在web.xml中进行配置:
<filter>
<filter-name>Limit</filter-name>
<filter-class>org.jvsun.tools.FilterNo</filter-class>
</filter>
<filter-mapping>
<filter-name>Limit</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/*表示过滤掉所有的请求,这时候访问项目下的任何文件,都是没有响应的。 配置完后我们还要放行部分模块或者把设置符合某些设置的条件的模块放行:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class FilterCRM implements Filter {
public void destroy() {
System.out.println("销毁过滤器");
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
String path = request.getContextPath();//获取根路径
request.setCharacterEncoding("utf-8");//统一编码格式
String url = request.getRequestURI();//获取请求页面的相对路径
HttpSession session = request.getSession();//获取本次会话中的session值
//过滤没有登录session的非法用户,过滤全部,放行登录相关模块,如登陆检测servlet和验证码的servlet
if(null == session.getAttribute("pojo")
&& url.indexOf("login.jsp") == -1
&& url.indexOf("CheckLoginId") == -1
&& url.indexOf("VerifyCodeServlet") == -1){
response.sendRedirect(path+"/manager/login.jsp");
}
else{
arg2.doFilter(arg0, arg1);//不符合过滤条件,向下转发
}
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println("初始化过滤器");
}
}
上面代码中注释很清楚了,这段代码中不进行过滤的有:含有session信息的所有模块,登录模块,登录处理以及验证码处理。
对请求的内容进行统一的编码,这里统一UTF-8:
web.xml中的配置:
<filter>
<filter-name>setCharacterEncoding</filter-name>
<filter-class>org.jvsun.tools.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
新建一个EncodingFilter类,实现Filter接口,对所有请求内容设置UTF-8编码:
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter {
private String encoding;
private Map<String, String> params = new HashMap<String, String>();
public void destroy() {
System.out.println("销毁过滤器");
params=null;
encoding=null;
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
req.setCharacterEncoding(encoding);
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
System.out.println("初始化拦截器");
encoding = config.getInitParameter("encoding");
for (Enumeration e = config.getInitParameterNames();
e.hasMoreElements();) {
String name = (String) e.nextElement();
String value = config.getInitParameter(name);
params.put(name, value);
}
}
}