原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处
前面我们介绍过设置Servlet请求和响应的字符编码。当时的做法是这样:
直接在当前Servlet接口上HttpServletRequest或者HttpServletResponse的编码。照这么看,那么我们有多少个Servlet就得设置多少个类似的编码。项目中只有一个两个Servlet那还好说,如果项目中有几百个呢?当然,神奇的Servlet也想到了这个问题,于是它为我们提供了过滤器(Filter)这样的解决方案。
Servlet的过滤器体现了面向切面(AOP)的编程思想。那么什么是面向切面呢?我们可以把客户端和服务端之间数据传输过程比作是水管流水,这个传输的连接就是水管,HttpServletRequest和HttpServletResponse就是水管里的水,往外或者往内流,那么,我们的Filter就可以看做是把水管横着切开,然后插入一个个大小不同网来拦截水中不同的东西。
简单画了一下我们客户端和服务端数据交流的示意图。如图所示:
public class EncodingFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
// TODO Auto-generated method stub
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
和Servlet一样,Fliter也有自己的生命周期:
那么,别的不多讲,有兴趣的可以像试验Servlet在每个方法内打印一下,我们现在往doFilter()内写入处理字符编码的业务逻辑:
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
arg0.setCharacterEncoding("UTF-8");//设置请求编码
arg1.setCharacterEncoding("UTF-8");//设置响应编码
arg2.doFilter(arg0,arg1);//处理过的请求传回原来的连接
}
其中FilterChain这个类主要是为了实现将处理过请求传回原来的连接,相当于给请求放行。因此我们可以利用这个移动端验证登陆的过滤器,逻辑是用户登陆之后服务器返回一个登陆的key并保存在缓存或者数据库,移动端每次请求别的接口都需要在参数中驾驶证这个key,然后过滤器来验证这个key在服务端是否存在,如果不存在,就不通过。
Filter写好了,我们怎么用在Servlet上呢?配置web.xml,和Servlet的配置很像:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.dyg.Filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
写完之后如图:
这段配置和Servlet的配置很像,只不过url-pattern是配置过滤的路径,这里”/“表示过滤所有的请求,按照图中配置,如果将”/“改为”/test”则是过滤上,上面testServlet这个请求,该配置比较灵活,有可以做很多事情比如: