Java过滤器Filter使用详解

article/2025/8/26 3:46:08
<div id="post_detail">

 转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6374212.html

 在我的项目中有具体应用:https://github.com/ygj0930/CoupleSpace

过滤器

   过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

      如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。

     在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:

    

     过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。

     下面是过滤器的简单应用:

    1:创建过滤器

   

    如图,新建一个class,实现接口Filter(注意:是javax.servlet中的Filter)。

    2:重写过滤器的doFilter(request,response,chain)方法。另外两个init()、destroy()方法一般不需要重写。在doFilter方法中进行过滤操作。

    常用代码有:获取请求、获取响应、获取session、放行。

    剩下的代码就是根据session的属性进行过滤操作、设置编码格式等等了,看情况而定。

复制代码
HttpServletRequest request=(HttpServletRequest) arg0;//获取request对象
HttpServletResponse response=(HttpServletResponse) arg1;//获取response对象
HttpSession session=request.getSession();//获取session对象过滤操作代码......chain.doFilter(request, response);//放行,通过了当前过滤器,递交给下一个filter进行过滤
复制代码

    3:在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器>过滤器>servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。

复制代码
<filter>  <filter-name>loginFilter</filter-name>//过滤器名称  <filter-class>com.ygj.control.loginFilter</filter-class>//过滤器类的包路径
<init—param> //可选 <param—name>参数名</param-name>//过滤器初始化参数<param-value>参数值</param-value>  
</init—pamm>  
</filter> <filter-mapping>//过滤器映射  <filter-name>loginFilter</filter-name>  
<url—pattern>指定过滤器作用的对象</url-pattern>
复制代码

    在配置中需要注意的有两处:一是<filter-class>指明过滤器类所在的包路径。二是<url-pattren>处定义过滤器作用的对象。一般有以下规则:

    1:作用与所有web资源:<url—pattern>/*</url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。

    2:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>

    3:作用于某一种类型的文件:<url—pattern>*.扩展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>过滤所有对jsp文件的访问请求。

    4:作用于某一文件夹下某一类型文件:<url—pattern>/dir/*.扩展名</url-pattern>

    如果一个过滤器需要过滤多种文件,则可以配置多个<filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则。

复制代码
   <filter><filter-name>loginFilter</filter-name><filter-class>com.ygj.control.loginFilter</filter-class></filter><filter-mapping><filter-name>loginFilter</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><filter-mapping><filter-name>loginFilter</filter-name><url-pattern>*.do</url-pattern></filter-mapping>
复制代码

    例1:用过滤器实现登录验证,没登录则驳回访问请求并重定向到登录页面。

复制代码
public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request</span>=<span style="color: #000000;">(HttpServletRequest) arg0; HttpServletResponse response</span>=<span style="color: #000000;">(HttpServletResponse) arg1; HttpSession session</span>=<span style="color: #000000;">request.getSession(); String path</span>=<span style="color: #000000;">request.getRequestURI(); Integer uid</span>=(Integer)session.getAttribute("userid"<span style="color: #000000;">); </span><span style="color: #0000ff;">if</span>(path.indexOf("/login.jsp")&gt;-1<span style="color: #000000;">){//登录页面不过滤 arg2.doFilter(arg0, arg1);//递交给下一个过滤器 </span><span style="color: #0000ff;">return</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">if</span>(path.indexOf("/register.jsp")&gt;-1<span style="color: #000000;">){//注册页面不过滤 arg2.doFilter(request, response); </span><span style="color: #0000ff;">return</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">if</span>(uid!=<span style="color: #0000ff;">null</span><span style="color: #000000;">){//已经登录 arg2.doFilter(request, response);//放行,递交给下一个过滤器 }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{ response.sendRedirect(</span>"login.jsp"<span style="color: #000000;">); } }</span></pre>
复制代码

     例2:设置字符编码

复制代码
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest request2=(HttpServletRequest) request;HttpServletResponse response2=(HttpServletResponse) response;
request2.setCharacterEncoding(</span>"UTF-8"<span style="color: #000000;">); response2.setCharacterEncoding(</span>"UTF-8"<span style="color: #000000;">); chain.doFilter(request, response); }</span></pre>
复制代码
分类: C9 开发笔记
标签: Java, 过滤器, Filter
好文要顶 关注我 收藏该文
.长卿 关注 - 3 粉丝 - 276
+加关注
4
1
«  上一篇: J4架构应用过程中出现的问题与解决摘录 »  下一篇: Java监听器Listener使用详解
</div><div class="postDesc">posted @ <span id="post-date">2017-02-07 15:10</span> <a href="https://www.cnblogs.com/ygj0930/">.长卿</a> 阅读(<span id="post_view_count">77630</span>) 评论(<span id="post_comment_count">4</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=6374212" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(6374212);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=302747,cb_entryId=6374212,cb_blogApp=currentBlogApp,cb_blogUserGuid='485879be-596f-e611-9fc1-ac853d9f53cc',cb_entryCreatedDate='2017/2/7 15:10:00';loadViewCount(cb_entryId);var cb_postType=1;var isMarkdown=false;</script>
评论列表
<div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3907981,'38Ck/+nHC5l1Ks2EvHlBQM27I1AGTyJvDr3To898hFy4/5iReuMCQw==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3907981,'38Ck/+nHC5l1Ks2EvHlBQM27I1AGTyJvDr3To898hFy4/5iReuMCQw==')">引用</a></span></div><a href="#3907981" class="layer">#1楼</a><a name="3907981" id="comment_anchor_3907981"></a>  <span class="comment_date">2018-02-13 12:15</span> <a id="a_comment_author_3907981" href="https://www.cnblogs.com/xuyiqing/" target="_blank">一清</a> <a href="http://msg.cnblogs.com/send/%E4%B8%80%E6%B8%85" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3907981" class="blog_comment_body">不错</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3907981,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3907981,'Bury',this)">反对(0)</a></div><span id="comment_3907981_avatar" style="display:none;">http://pic.cnblogs.com/face/1312707/20180713142841.png</span></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(4031196,'fiyNKaIN2pM9RS6hyxaRVhfqY5RUa/9wfp2GBHkVTD6n5x+34NqW0w==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(4031196,'fiyNKaIN2pM9RS6hyxaRVhfqY5RUa/9wfp2GBHkVTD6n5x+34NqW0w==')">引用</a></span></div><a href="#4031196" class="layer">#2楼</a><a name="4031196" id="comment_anchor_4031196"></a>  <span class="comment_date">2018-07-29 14:50</span> <a id="a_comment_author_4031196" href="https://www.cnblogs.com/iTarget/" target="_blank">iTarget</a> <a href="http://msg.cnblogs.com/send/iTarget" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_4031196" class="blog_comment_body">说得挺清晰的,不错。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(4031196,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(4031196,'Bury',this)">反对(0)</a></div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(4059361,'t+tM3yWGCaUcmGRzPzfC1mmOYJ0EVUI0O154VvZ4Qyk2WB8/whhxpg==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(4059361,'t+tM3yWGCaUcmGRzPzfC1mmOYJ0EVUI0O154VvZ4Qyk2WB8/whhxpg==')">引用</a></span></div><a href="#4059361" class="layer">#3楼</a><a name="4059361" id="comment_anchor_4059361"></a>  <span class="comment_date">2018-09-06 09:57</span> <a id="a_comment_author_4059361" href="https://www.cnblogs.com/qiaoyutao/" target="_blank">当初的当初</a> <a href="http://msg.cnblogs.com/send/%E5%BD%93%E5%88%9D%E7%9A%84%E5%BD%93%E5%88%9D" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_4059361" class="blog_comment_body">谢谢你</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(4059361,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(4059361,'Bury',this)">反对(0)</a></div><span id="comment_4059361_avatar" style="display:none;">http://pic.cnblogs.com/face/1454236/20190313143852.png</span></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(4138794,'c1QSJAiw/7TruXAmN2sbjMuFNlb7Cra+/aaFOFKoZHAgfVkhEO8+UA==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(4138794,'c1QSJAiw/7TruXAmN2sbjMuFNlb7Cra+/aaFOFKoZHAgfVkhEO8+UA==')">引用</a></span></div><a href="#4138794" class="layer">#4楼</a><a name="4138794" id="comment_anchor_4138794"></a><span id="comment-maxId" style="display:none;">4138794</span><span id="comment-maxDate" style="display:none;">2018/12/13 23:21:33</span>  <span class="comment_date">2018-12-13 23:21</span> <a id="a_comment_author_4138794" href="http://home.cnblogs.com/u/1301364/" target="_blank">MaoHee</a> <a href="http://msg.cnblogs.com/send/MaoHee" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_4138794" class="blog_comment_body">在web.xml中定义Filter或Servlet的顺序并无先后,只是服务器在加载的时候按:监听器&gt;过滤器&gt;Servlet的顺序加载的而已。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(4138794,'Digg',this)">支持(4)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(4138794,'Bury',this)">反对(0)</a></div></div></div>
<div id="comments_pager_bottom"></div></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
刷新评论 刷新页面 返回顶部
发表评论

昵称:

评论内容:
引用
粗体
链接
缩进
代码
图片

不改了 退出 订阅评论

[Ctrl+Enter快捷键提交]

【推荐】超50万C++/C#源码: 大型实时仿真组态图形源码 【活动】看雪2019安全开发者峰会,共话安全领域焦点 【培训】Java程序员年薪40W,他1年走了别人5年的路
最新新闻
· 日本显示器公司连续第五年亏损 宣布裁员1000人
· 深网|万达百货更名苏宁易购广场 改造店5月底亮相
· 圈重点!腾讯全球数字生态大会带来不一样的智慧医疗
· 3岁娃成“社交万人迷”?别再被天价“情商培训班”忽悠了
· 国产手机十年厮杀过后,为何只剩下华为带着米OV?
» 更多新闻...
</div><!--end: forFlow -->
</div>

http://chatgpt.dhexx.cn/article/4LYbJ25Z.shtml

相关文章

java中拦截器和过滤器详解

1 过滤器和拦截器的异同 1.1 一张图表明两者之间的差异&#xff1a; tomcat&#xff0c;filter&#xff0c;servet&#xff0c;interceptor以及controller等各种容器的关系图 1.2 两者的区别&#xff1a; 拦截器是基于java的反射机制的&#xff0c;而过滤器是基于函数回调。 …

【java】Filter过滤器

强烈推荐一个大神的人工智能的教程&#xff1a;http://www.captainai.net/zhanghan 一、简介 Filter也称为过滤器&#xff0c;是Servlet中的一项技术&#xff0c;可以管理Web服务器管理的一系列资源&#xff0c;例如jsp,html等。Servlet API中提供了一个Filter接口&#xff0c…

[Java]过滤器(Filter)

一、什么是过滤器 过滤器是Servlet的高级特性之一&#xff0c;是实现Filter接口的Java类&#xff01; 过滤器的执行流程&#xff1a; 从上面的图我们可以发现&#xff0c;当浏览器发送请求给服务器的时候&#xff0c;先执行过滤器&#xff0c;然后才访问Web的资源。服务器响应…

Java中的过滤器Filter

本文用于学习所用&#xff0c;有不足及错误之处欢迎指出和补充。 目录 一&#xff1a;Filter简介 二&#xff1a;关于Filter &#xff08;一&#xff09;如何使用Filter进行过滤 &#xff08;二&#xff09;过滤器链 (FilterChain) &#xff08;三&#xff09;Filter的配置…

Java之过滤器

一.基本定义: 过滤器实际上就是对web资源进行拦截&#xff0c;做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的&#xff0c;也可以对返回的response进行拦截处理 二.新建一个Filter: 可以直接new一个Filter类.输入过滤器名称&#xff0c;跟创…

java过滤器(Filter)

目录 1 过滤器简介 2 Filter详细介绍 3 Filter的用法 3.1 用法1 3.2 用法2 1 过滤器简介 filter也称之为过滤器&#xff0c;它是javaWeb三大组件之一&#xff08;Servlet程序、Listener监听器、Filter过滤器&#xff09; 作用&#xff1a;既可以对请求进行拦截&#xff0…

Java Web之过滤器(Filter)

过滤器(Filter) 过滤器实际上就是对web资源进行拦截&#xff0c;做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的&#xff0c;也可以对返回的response进行拦截处理 大概流程图如下 应用场景 自动登录 统一设置编码格式 访问权限控制 敏感字符…

C#生成二维码和条形码并实现打印的功能

转载&#xff1a;https://www.cnblogs.com/xixim/p/4589078.html 下载地址&#xff1a;http://pan.baidu.com/s/1kTr3Vuf Step1&#xff1a;使用VS2010新建一个窗体程序项目&#xff1a; Step2&#xff1a;添加三个类&#xff1a;分别是BarCodeClass.cs、DocementBase.cs、im…

web项目js调用斑马打印机打印二维码

斑马打印机打印二维码 项目&#xff08;Web项目&#xff09;功能中存在生成并打印二维码的功能&#xff0c;需要借助打印机打印出二维码。由于业务需求二维码需要打印在不干胶的材料上并可以进行粘贴&#xff0c;所以借助斑马打印机通过热敏不干胶纸进行打印。 需要结合所使用…

python实现扫描二维码并打印数据

编译环境 1、操作系统&#xff1a;windows 10 2、语言&#xff1a;python 3.7.0 3、编辑器&#xff1a;pycharm-community-2018.2.8 4、需要提前安装的库&#xff1a;pyzbar、opencv-python 代码 # 首先导入本次所需要的库&#xff0c;最后一个csv是Python自带的csv表格操…

uni-app H5+ 连接蓝牙打印机打印文字及二维码

基于Native.js 实现的连接蓝牙打印机 打印效果图核心代码测试代码运行设备及环境PS&#xff1a;PPS&#xff1a;Demo 打印效果图 核心代码 /*** Description: 蓝牙打印类 基于h5 Native.js* Author: EricLee* Date: 2020-10-14 13:53:23* Param: mod* Return: $*/export cons…

5,uniapp功能之—打印机,打印文本和二维码等,(佳博的打印机)

效果图&#xff1a; 思路&#xff1a;1&#xff0c;一个打印按钮&#xff0c;2点击按钮弹窗一个蓝牙模块&#xff0c;选择蓝牙进行连接&#xff0c;连接成功就直接进行打印了&#xff0c;3&#xff0c;打印的内容自己设置 项目结构&#xff1a; 上代码&#xff0c;打印机参数…

批量生成二维码、打印

推荐使用GoodMES云标签打印&#xff0c;地址为&#xff1a;https://t.goodmes.com/home 1、登陆后点击设计与打印——>数据表 2、需要下载云标签打印 3、下载后进行登陆 4、登陆后无需管它&#xff0c;放在那运行即可 5、这个时候你的云标签助手就会现在在线状态 6、点…

electron打印条形码、二维码

功能&#xff1a;在electron打印条形码或者二维码 在百度搜索找不到合适的博客与插件&#xff0c;就在github上找到一个插件 electron-pos-printer 可以一键打印图片、文本、二维码、条形码、表格 不用安装其他多余插件&#xff0c;亲测十分好用 1、安装 npm install ele…

佳博打印机打印条码和二维码的方法

最近项目需求连接蓝牙打印机打印小票 其中小票中有条码和二维码&#xff0c;很多朋友刚接触打印接的打印逻辑&#xff0c;看不太明白&#xff0c;因此我之前给各位提供现成的打印方法&#xff1a; 关键就是安装打印的文档 提前写好各种打印的调用发放&#xff0c;直接在打印模…

【C#】简单二维码制作和打印

系列文章 【C#】条码管理操作手册 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126589496 【C#】IIS平台下&#xff0c;WebAPI发布及异常处理 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126539836 【C#】简单二维…

一维码二维码的生成及打印

VUE条形码及二维码的生成及输出到打印机 文章目录 VUE条形码及二维码的生成及输出到打印机1. 条形码的生成2. 二维码的生成3. 输出打印4. 将代码提取一下 1. 条形码的生成 安装插件 npm install jsbarcode --save github地址&#xff1a; https://github.com/lindell/JsBarcode…

C#二维码的生成及打印

窗体设计显示图 一&#xff0c;生成二维码 /// <summary>/// 生成二维码/// </summary>/// <param name"text">内容</param>/// <param name"width">宽度</param>/// <param name"height">高度</p…

生成二维码,并且打印

生成二维码&#xff0c;并且打印出来 加入依赖 //二维码依赖 npm install --save qrcodejs2 //打印依赖 npm install vue-print-nb --save在mian文件夹中使用引入并使用&#xff0c;或者按需引入 //打印依赖 import Print from vue-print-nb Vue.use(Print)本次二维码是按需引…

二维码打印

1. 二维码简介 二维码&#xff08;2-dimensional bar code&#xff09;&#xff0c;又称二维条码&#xff0c;它是用特定的几何图形按一定规律在平面&#xff08;二维方向&#xff09;上分布的黑白相间的图形&#xff0c;是所有信息数据的一把钥匙。在现代商业活动中&…