Filter过滤器的强大功能
2016-02-18 14:53
281 查看
/article/1596762.html
我们编程开发一般都是按照线来工作,这样分工容易,测试也相对来说方便!高手,或者开发经验比较丰富团队就会按照层来工作。而面向对象又是当今非常主流的一种开发方式,而其三大特性就是:封装,继承,多态,使程序达到复用性强,扩展性强……而今天Filter就是更好的使我们的程序达到更好的复用性,用最少的代码实现最多的功能。
在介绍Filter以前,先看一下上一篇AOP(Aspect
Oriented Programming )面向切面编程,其实Filter就是其中非常重要的一项技术,通常我们会把身份验证,日志等代码写到Filter(过滤器中)进行过滤,这样既能保证每一个servlet不用写这些代码,减少了工作量,又提高了代码的复用性,使代码更加容易维护。
先简单介绍一下Filter吧。Filter就像我们生活中的过滤器,可以过滤一些我们不想要的东西,或者在经过特殊处理以前进行统一的处理,这样会大大方便我们。而在Java编程中,Filter就有这样的功能,它不经能够在将请求进行层层过滤,还可以响应进行层层过滤,也是一种规范吧,和Servlet是非常相似的。看下边这样图,就能非常形象的看出Filter的强大功能。
![](http://img.blog.csdn.net/20140208204839187?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1amlhaGFuNjI5NjI5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
大家都知道,当我们没有登录一个网站时,我们是不能对其任何一个网页进行已登录操作的,所以网站的每一个网址就需要我们来进行身份验证,而我们不可能在每一个servlet中进行编写,所以需要我们进行面向横切面编程,将这些共同的代码放到Filter中,来达到我们想要的效果。
首先我们要写一个类,来实现Filter这个接口,并将用户验证写在这里边:
[java]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
<span style="font-size: 18px;">public class CheckLoginFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException { //将上边的ServletRequest转化为HttpServletRequest,response也是 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp; //获取请求路径,也就是首页登陆的路径 String servletPath = request.getServletPath(); //获取session,看是否有登陆的信息 HttpSession session = request.getSession(false); //如果是登陆页面,或者session不为空并且session中的user不为空, if("/servlet/login".equals(servletPath) || (session != null && session.getAttribute("user") != null)){ //已经登录,执行下一个Filter,如果没有则进行对应的servlet chain.doFilter(request, response); //如果这个后边有代码,则是对响应进行过滤 }else{ //如果没有登录信息,则跳转到登录页面,(或者只可以浏览的权限界面) response.sendRedirect("/"); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } } </span>
当然,写好了这些功能代码,我们还需要在web.xml进行配置:
[html]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
<span style="font-size: 18px;"><!-- 验证是否已经登录的过滤器 --> <filter> <filter-name>isLoginFilter</filter-name> <filter-class>filter.CheckLoginFilter</filter-class> </filter> <filter-mapping> <filter-name>isLoginFilter</filter-name> <!--注意里边*的写法,是匹配所有以/servlet/开头的servlet --> <url-pattern>/servlet/*</url-pattern> </filter-mapping> </span>
这样,我们就基本上完成了,虽然可能还不完善,但是用过滤器来改善代码的目的达到了。当然在过滤器还可以编写,权限控制的代码,存储日志的代码,过滤IP的代码等等,非常有用的。
我们编程开发一般都是按照线来工作,这样分工容易,测试也相对来说方便!高手,或者开发经验比较丰富团队就会按照层来工作。而面向对象又是当今非常主流的一种开发方式,而其三大特性就是:封装,继承,多态,使程序达到复用性强,扩展性强……而今天Filter就是更好的使我们的程序达到更好的复用性,用最少的代码实现最多的功能。
在介绍Filter以前,先看一下上一篇AOP(Aspect
Oriented Programming )面向切面编程,其实Filter就是其中非常重要的一项技术,通常我们会把身份验证,日志等代码写到Filter(过滤器中)进行过滤,这样既能保证每一个servlet不用写这些代码,减少了工作量,又提高了代码的复用性,使代码更加容易维护。
先简单介绍一下Filter吧。Filter就像我们生活中的过滤器,可以过滤一些我们不想要的东西,或者在经过特殊处理以前进行统一的处理,这样会大大方便我们。而在Java编程中,Filter就有这样的功能,它不经能够在将请求进行层层过滤,还可以响应进行层层过滤,也是一种规范吧,和Servlet是非常相似的。看下边这样图,就能非常形象的看出Filter的强大功能。
大家都知道,当我们没有登录一个网站时,我们是不能对其任何一个网页进行已登录操作的,所以网站的每一个网址就需要我们来进行身份验证,而我们不可能在每一个servlet中进行编写,所以需要我们进行面向横切面编程,将这些共同的代码放到Filter中,来达到我们想要的效果。
首先我们要写一个类,来实现Filter这个接口,并将用户验证写在这里边:
[java]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
<span style="font-size: 18px;">public class CheckLoginFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException { //将上边的ServletRequest转化为HttpServletRequest,response也是 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp; //获取请求路径,也就是首页登陆的路径 String servletPath = request.getServletPath(); //获取session,看是否有登陆的信息 HttpSession session = request.getSession(false); //如果是登陆页面,或者session不为空并且session中的user不为空, if("/servlet/login".equals(servletPath) || (session != null && session.getAttribute("user") != null)){ //已经登录,执行下一个Filter,如果没有则进行对应的servlet chain.doFilter(request, response); //如果这个后边有代码,则是对响应进行过滤 }else{ //如果没有登录信息,则跳转到登录页面,(或者只可以浏览的权限界面) response.sendRedirect("/"); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } } </span>
<span style="font-size: 18px;">public class CheckLoginFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException { //将上边的ServletRequest转化为HttpServletRequest,response也是 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp; //获取请求路径,也就是首页登陆的路径 String servletPath = request.getServletPath(); //获取session,看是否有登陆的信息 HttpSession session = request.getSession(false); //如果是登陆页面,或者session不为空并且session中的user不为空, if("/servlet/login".equals(servletPath) || (session != null && session.getAttribute("user") != null)){ //已经登录,执行下一个Filter,如果没有则进行对应的servlet chain.doFilter(request, response); //如果这个后边有代码,则是对响应进行过滤 }else{ //如果没有登录信息,则跳转到登录页面,(或者只可以浏览的权限界面) response.sendRedirect("/"); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } } </span>
当然,写好了这些功能代码,我们还需要在web.xml进行配置:
[html]
view plain
copy
print?
![](https://code.csdn.net/assets/CODE_ico.png)
<span style="font-size: 18px;"><!-- 验证是否已经登录的过滤器 --> <filter> <filter-name>isLoginFilter</filter-name> <filter-class>filter.CheckLoginFilter</filter-class> </filter> <filter-mapping> <filter-name>isLoginFilter</filter-name> <!--注意里边*的写法,是匹配所有以/servlet/开头的servlet --> <url-pattern>/servlet/*</url-pattern> </filter-mapping> </span>
<span style="font-size: 18px;"><!-- 验证是否已经登录的过滤器 --> <filter> <filter-name>isLoginFilter</filter-name> <filter-class>filter.CheckLoginFilter</filter-class> </filter> <filter-mapping> <filter-name>isLoginFilter</filter-name> <!--注意里边*的写法,是匹配所有以/servlet/开头的servlet --> <url-pattern>/servlet/*</url-pattern> </filter-mapping> </span>
这样,我们就基本上完成了,虽然可能还不完善,但是用过滤器来改善代码的目的达到了。当然在过滤器还可以编写,权限控制的代码,存储日志的代码,过滤IP的代码等等,非常有用的。
相关文章推荐
- block传值的简单实现
- TransformerFactory(示例,出错代码)
- linux服务器TCP并发连接数优化
- (21)odoo中的QWeb模板引擎
- eclipse安装color theme插件
- 体系结构模式简介
- 高斯消元练习
- Android侧滑菜单(最简)
- 创建本地yum源
- URL介绍及处理
- Android Studio 小技巧合集
- php从数据库中读取特定的行
- mysql-存储过程
- Win7(64bit)搭建SVN
- IOS开发之常见bug
- 关于Windows10中使用预览窗格无法预览Excel及图片文件的问题
- 普通二维码和带图片二维码生成
- 面向切面编程(AOP)的理解
- Unity3d 中的 A*寻路
- 《笨办法学Python》 第39课手记