前言

有这样一个常见的开发场景,我们编写一套系统,或者分析一套系统如何实现的过程中,我们肯定会发现这套系统的拦截机制.比如说京东或者淘宝之类的,存在这种拦截机制,这套拦截机制能够过滤掉哪些错误的登录注册请求,或者是一些其他非法请求.这样就在很大的程度上保证了系统的安全性.可以想到,类似的应用场景肯定还有很多,我这里就不一一列举了.

这个场景应用的最基本的技术就是拦截器(Filter)技术,当然我们这里介绍的拦截器只是Servlet技术中的一部分,不涉及到任何框架之类的.要记住,这些最基本的技术是相当重要的,学好基本的东西才能更好的掌握更加高级的东西!

Filter的其他应用

上面我们讲了Filter的基本应用,作为拦截器,拦截哪些错误的或者有攻击性的请求,实际上,过滤器技术还有很多实用性的功能,我们来简单介绍一下:

  • 减少重复代码

    比如说之前我们介绍的POST和GET方法的乱码解决方案,显然这种代码如果不进行封装,则会出现在每一个Servlet之中,代码复用率低得很,这时候Filter就能够大显身手了.
  • 实际项目中:判断用户是否登录,只有登录的用户才能进行相应的操作
  • 记录传入的请求
  • 加密和解密(应用在密码上,提高安全性)
  • 例子还有很多,就不再过多列举

Filter在Servlet架构中所处的位置

如下图:



可以看到,来自用户的请求是率先发送给过滤器的,经过过滤器判断,才能决定是否将请求放行到Servlet之中.到了这一步还不算完成整个过程,请求到达Servlet中后,经过处理,会将相应返回到Filter之中,最后再到达用户.整个工作过程就是这样的.

好了,说了这么多基本的知识,马上就开始我们的实际开发吧!

从一个简单的例子开始

下面的这个例子来自于我的小型项目中的一部分,我做了一些删减,力求初学者能够看明白,其他的暂时先不用管,你只需要看doFilter方法中的代码即可.

package com.roobtyan.cn.login;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebFilter(filterName = "LoginFilter",urlPatterns = {"/*"})
public class LoginFilter implements Filter {
private FilterConfig config; public void destroy() {
} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//开始一个过滤器
//取出当前的servlet上下文对象
ServletContext context = this.config.getServletContext();
//开始计时
long startTime = System.currentTimeMillis();
System.out.println("过滤器开始工作....");
//let request cast to HttpServletRequest
HttpServletRequest request = (HttpServletRequest)req;
request.setCharacterEncoding("utf8");
//print message
System.out.println("请求的地址是:" + request.getServletPath());
//System.out.println(request.getRequestURI());
//放行
chain.doFilter(req, resp);
long endTime = System.currentTimeMillis();
//print all time
System.out.println("过滤器工作结束...");
System.out.println("总计工作时常是: " + (endTime-startTime) + "ms");
} public void init(FilterConfig config) throws ServletException {
this.config = config;
} }

可以看到,这个例子是很简单的,主要的工作就是记录下客户端请求的URL,拿到后直接放行到相应的Servlet中进行处理.

由于servlet3.0之后可以对Filter,Listener,Servlet使用注解配置,我这里就是用了注解配置,个人比较喜欢用这种方法,当然也可以使用web.xml进行配置,我们下面就来介绍一下这两配置方法,以及相应的作用.(对代码进行从上到下的分析)

配置方法

注解配置

@WebFilter(filterName = "LoginFilter",urlPatterns = {"/*"})
......

这种方法,非常简单,filterName就是自定义的过滤器的名字,而urlPatterns就是你到底想要对哪个请求过滤,这里使用的/*就是对所有的请求过滤.这种方法还是非常简单的,就不过多介绍.

web.xml配置

<web-app>  

<filter>
<filter-name>...</filter-name>
<filter-class>...</filter-class>
</filter> <filter-mapping>
<filter-name>...</filter-name>
<url-pattern>...</url-pattern>
</filter-mapping> </web-app>

这个Filter的配置和Servlet的配置方法其实是一样的.一个是对Filter类的配置,另外一个就是Filterl类的映射,两个filter-name的值必须是一样的.url-pattern自然也就是拦截的请求地址了.

好了,分析完如何对Filter配置,接下来要做的就是分析一下这几个方法.也就是常用的Filter API.

当然,不论是第一种方法或者第二种方法,都能对指定的URL进行拦截,并且可以是多个.第一种配置方法直接按照这种格式 {“/login”,”/welcome.jsp”};第二种直接在url-pattern下再写上多个url-pattern参数就可以了.

常用的Filter API

Filter

这个接口是过滤器的核心接口,必不可少

常用方法如下:

  • void init(filterConfig)

    初始化方法,此方法会在服务器启动的时候运行
  • void doFilter(request,response,filterChain)

    过滤器拦截的业务处理方法
  • void destroy()

    销毁过滤器时使用.

FilterConfig

这个接口用于获取初始化参数信息

- String getInitParameter(java.lang.String name)

- Enumeration getInitParameterNames()

第一个方法是获取特定的初始化参数,第二个是获取全部的初始化参数.

FilterChain

过滤器链参数;一个个过滤器形成一个执行链;

这句话你可能看不太明白,简单的说,这个对象负责调用

用户-过滤器-servlet

这条链中的servlet资源或者是下一个过滤器的.

再简单的说,就是这货能够将过滤操作停止,并将全部的信息向下传送.

仅有的一个方法如下:

public void doFilter(HttpServletRequest request,HttpServletResponse response)
它将控件传递给下一个过滤器或资源。

结语

感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

微信公众号:进击的程序狗

邮箱:roobtyan@outlook.com

个人博客:http://roobtyan.cn

扫描下面的二维码关注我吧,你将收获到意想不到的东西哟……

给大家准备了一份非常棒的JAVA的视频教程,从JAVA基础一直到JAVAWEB,还有非常强大的项目实战。

就在我的微信公众号里,回复java就可查看,免费的呦!

Filter过滤器技术详解的更多相关文章

  1. Hbase Filter过滤器查询详解

    过滤器查询 引言:过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器 过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端: hbase过滤器的比较运算符: LE ...

  2. SSE技术详解:一种全新的HTML5服务器推送事件技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  3. 《Tomcat与Java Web开发技术详解》思维导图

    越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...

  4. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  5. 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

  6. 手游录屏直播技术详解 | 直播 SDK 性能优化实践

    在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...

  7. 《CDN技术详解》 - CDN知多少?

    开发时间久了,就会接触到性能和并发方面的问题,如果说,在自己还是菜鸟的时候完全不用理会这种问题或者说有其他的高手去处理这类问题,那么,随着经验的丰富起来,自己必须要独立去处理了.或者,知道思路也行,毕 ...

  8. Comet技术详解:基于HTTP长连接的Web端实时通信技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  9. Protocol Buffer技术详解(数据编码)

    Protocol Buffer技术详解(数据编码) 之前已经发了三篇有关Protocol Buffer的技术博客,其中第一篇介绍了Protocol Buffer的语言规范,而后两篇则分别基于C++和J ...

随机推荐

  1. python merge、join、concat用法与区别

     由于合并变化较大,以后函数可能会修改,只给出一些例子作为参考 总结: merge.join 1.当没有索引时:merge.join为按照一定条件合并 2.当有索引.并按照索引合并时,得到结果为两者混 ...

  2. 字符串题汇总(python3)

    1.最小编辑距离 假设有两个字符串s1和s2,计算通过增添.删除.替换三种操作后,从s1转变为s2所需要的操作次数. #coding=utf-8 class Solution: def editDis ...

  3. Koa微信公众号开发

    微信开发者模式开启需要服务器域名合法并且把接口配置好,这个接口是接通的关键,接通后微信后台的菜单设置功能,客服功能会失效,需要开发者自定义菜单和智能客服界面,并且接通后可以调用微信网页内部的定位分享等 ...

  4. 使用python将请求的requests headers参数格式化方法

    import json # 使用三引号将浏览器复制出来的requests headers参数赋值给一个变量 headers = """ Host: zhan.qq.com ...

  5. 017.Oracle数据库,取今年第一天,取今年最后一天

    /*取今年第一天,取今年最后一天*/ SELECT trunc(sysdate, 'yyyy') AS 今年第一天 , add_months(trunc(sysdate, ) AS 今年最后一天 FR ...

  6. jmeter常见错误及解决方法

    jmeter常见错误:   错误一: Response code: Non HTTP response code: java.net.SocketTimeoutException Response m ...

  7. flask邮箱注册问题

    app/models.py self.confirmed = True db.session.add(self) db.session.commit() 这里的数据修改完后必须commit提交上去,不 ...

  8. SQL语句中为什么要用 where 1=1

    where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句,1=1 是永恒成立的,意思无条件的,也就是说在SQL语句中有没有这个1=1都可以. 如:web界面查 ...

  9. 文本编辑器vim/vi——模式切换及输入模式

    vim一共有三种模式:命令模式.输入模式.末行模式 要从命令模式切换到输入模式:a,i,o a——append 属于在后面追加内容:i——insert 属于插入,在前面插入内容:o——other 属于 ...

  10. CentOs 后台运行jar

    1.启动jar包,后台运行 nohup java -jar xxxx.jar & 2.结束运行 查出正在运行的进程 ps -ef | grep java 杀掉进程 kill pid 上面橙色字 ...