哈尔滨建站模板源码小发明小制作简单易学
web/
2025/10/6 20:04:38/
文章来源:
哈尔滨建站模板源码,小发明小制作简单易学,旅行网站建设,网站建设pdf下载原本计划这一篇来总结JSP#xff0c;由于JSP的内容比较多#xff0c;又想着晚上跑跑步减减肥#xff0c;所以今天先介绍Filter以及它的使用举例#xff0c;这样的话还有些时间可以锻炼锻炼。言归正传#xff0c;过滤器从字面理解她的话有拦网、过滤的功能#xff0c;可以…原本计划这一篇来总结JSP由于JSP的内容比较多又想着晚上跑跑步减减肥所以今天先介绍Filter以及它的使用举例这样的话还有些时间可以锻炼锻炼。言归正传过滤器从字面理解她的话有拦网、过滤的功能可以算是JavaWeb的拦精灵。 一、由来 客户端发起请求那服务器不能什么请求都做出响应,做拦截处理不仅能减轻服务器的压力还能保护数据的安全同样服务端做出响应给客户端时有时也需要进行过滤比如我们常见的图片添加水印。为了处理这些问题于是过滤器出现了。有时不仅仅对请求与响应进行一层的过滤可能会过滤多层所以提出了滤镜链(FilterChain)的概念. 二、使用 在使用它之前先熟悉下它的作用的地方。过滤器作用在请求Request到达Servlet之前以及响应Response到达浏览器之前会依次经过过虑链。有些类似asp.net中的httpmodule.使用Filter主要是实现javax.servlet.filter接口。查看API可看到有3个方法。 1.public void init(FilterConfig filterConfig) throws ServletException 由 Web 容器调用指示将放入服务中的过滤器。servlet 容器只在实例化过滤器之后调用一次 init 方法。在要求过滤器做任何过滤工作之前init 方法必须成功完成。如果 init 方法抛出 ServletException或没有在 Web 容器定义的时间段内返回则 Web 容器无法将过滤器放入服务中。这个和Servlet的生命周期有点类似也是只初始化一次destroy()也是执行一次。 2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException 每次由于对链末尾的某个资源的客户端请求而通过链传递请求/响应对时容器都会调用 Filter 的 doFilter 方法。传入此方法的 FilterChain 允许 Filter 将请求和响应传递到链中的下一个实体。此方法的典型实现遵循以下模式1. 检查请求2. 有选择地将带有自定义实现的请求对象包装到用于输入过滤的过滤器内容或头中 3. 有选择地将带有自定义实现的响应对象包装到用于输出过滤的过滤器内容或头中 4. a) 既可以使用 FilterChain 对象 (chain.doFilter()) 调用链中的下一个实体 4. b) 也可以不将请求/响应对传递给过滤器链中的下一个实体从而阻塞请求处理5. 在调用过滤器链中的下一个实体之后直接设置响应上的头。 3.public void destroy() 由 Web 容器调用指示将从服务中取出的过滤器。此方法仅在过滤器的 doFilter 方法中的所有线程都已退出之后调用一次或者在过了超时期之后调用。在调用此方法之后Web 容器不会再对此过滤器实例调用 doFilter 方法。此方法为过滤器提供了一个清除持有的所有资源比如内存、文件句柄和线程的机会并确保任何持久状态都与内存中该过滤器的当前状态保持同步。 三、案例 使用过滤器的地方有很多这里就不一一举例下面的demo在上篇博客中HelloWorld项目的基础上实现防盗链的功能以此体会Filter的使用。 1.准备 在HelloWolrd项目中新增一个文件夹在文件夹中放入两个图片一个err.png 一个test.png两个图如下 2.创建Filter 这里也没新建Filter包直接在上一博客中的com.test.cyw包中创建Filter文件MyFilter,应该是创建一个包专门管理Filter类的额这里只是做测试。创建完成之后可以看到MyFilter继承Filter。 public class MyFilter implements Filter View Code 3.在doFilter中实现防盗链 package com.test.cyw;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.annotation.WebFilter;
import javax.servlet.http.*;/*WebFilter(/MyFilter)*/
public class MyFilter implements Filter {public MyFilter() {}public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req(HttpServletRequest)request;HttpServletResponse res(HttpServletResponse)response;String refererreq.getHeader(referer);//链接来源地址if(referernull||!referer.contains(req.getServerName())){req.getRequestDispatcher(/Images/err.png).forward(req, res);return;}chain.doFilter(req, res);}public void init(FilterConfig fConfig) throws ServletException {}
} View Code 4.Filter配置 上面只是创建了一个类实现了Filter接口如何让Tomcat知道呢这和Servlet类似需要在Web.xml中配置。和配置servlet有点相同。 filterfilter-nameMyFilter/filter-namefilter-classcom.test.cyw.MyFilter/filter-class/filterfilter-mappingfilter-nameMyFilter/filter-nameurl-pattern/Images/*/url-pattern/filter-mapping View Code 5.测试 新建一个test.jsp文件在jsp中显示img可以正常显示 % page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
head
meta http-equivContent-Type contenttext/html; charsetUTF-8
titleInsert title here/title
/head
body
img alt防盗链 srcImages/test.png width400
/body
/html View Code 如果直接在浏览器输入test.png的地址则会显示err.png 四、遇到的问题 开始的时候由于地址错误导致谷歌浏览器test.jsp中显示的也是err.png的图片但当我换过来时刷新页面还是没变这个让我很纳闷。有时候将Tomca重启也不行试了好几次都是这样实在不行了用IE试了下没想到显示是正确的原来谷歌浏览器有缓存导致显示的不正确。 五、总结 Filter用处很多网上也有好多的例子,做项目时可以先实现一些常用的例如水印等用的时候只需配置下xml就能解决很是方便。转载于:https://www.cnblogs.com/5ishare/p/6557079.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88089.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!