filterchain(如何创建过滤器Filter)
本文目录
如何创建过滤器Filter
建立一个过滤器涉及下列五个步骤:1、建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilter方法包含主要的过滤代码,init方法建立设置操作,而destroy方法进行清楚。2、在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。3、调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。4、对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。5、禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。doFilter方法:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws ServletException, IOException{HttpServletRequest req = (HttpServletRequest)request;System.out.println(req.getRemoteHost() + “ tried to access “ +req.getRequestURL() +“ on “ + new Date() + “.“);chain.doFilter(request,response);}在web.xml中进行部署分别是:filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。1.filter元素filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六个可能的子元素::icon 这是一个可选的元素,它声明IDE能够使用的一个图象文件。:filter-name 这是一个必需的元素,它给过滤器分配一个选定的名字。:display-name 这是一个可选的元素,它给出IDE使用的短名称。:description 这也是一个可选的元素,它给出IDE的信息,提供文本文档。:filter-class 这是一个必需的元素,它指定过滤器实现类的完全限定名。:init-param 这是一个可选的元素,它定义可利用FilterConfig的getInitParameter方法读取的初始化参数。单个过滤器元素可包含多个init-param元素。2.filter-mapping元素filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三个可能的子元素:::filter-name 这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配。:url-pattern 此元素声明一个以斜杠(/)开始的模式,它指定过滤器应用的URL。所有filter-mapping元素中必须提供url-pattern或servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素项。如果希望过滤器适用于多个模式,可重复整个filter-mapping元素。:servlet-name 此元素给出一个名称,此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配。不能给单个filter-mapping元素提供多个servlet-name元素项。
如何实现一个简单地Filter
// 1. 创建一个web项目
// 2. 编写一个类实现 Filter 接口
// 3. 实现三个方法
// 4. 在web.xml中配置Filter参数
// 1
public class MyFilter01 implements Filter {
// 2
@Override
// filter对象初始化方法 filter对象创建时执行
// 服务器启动时就创建该filter对象
public void init(FilterConfig filterConfig) throws ServletException {
// 其中参数config代表 该Filter对象的配置信息的对象,内部封装是该filter的配置信息
String filterName = filterConfig.getFilterName();
ServletContext servletContext = filterConfig.getServletContext();
String initParameter = filterConfig.getInitParameter(“aaa“);
}
@Override
// 执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// ServletRequest/ServletResponse:每次在执行doFilter方法时
// web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。
// 该request个该response就是在访问目标资源的service方法时的request和response。
// FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求
System.out.println(“filter“);
chain.doFilter(request, response);
}
@Override
// filter销毁方法 当filter对象销毁时执行该方法
// 服务器关闭时filter销毁
public void destroy() {
}
}
// 3 配置
《filter》
《filter-name》Filter01《/filter-name》
《!-- 包名.类名 --》
《filter-class》my.filter.MyFilter01《/filter-class》
《/filter》
《filter-mapping》
《filter-name》Filter01《/filter-name》
《!-- 拦截所有 --》
《url-pattern》/*《/url-pattern》
《dispatcher》《/dispatcher》
《/filter-mapping》
java过滤器中实现Filter的类怎么写
web.xml配置文件
SessionFilter
com.qhit.system.tools.SessionFilter
SessionFilter
/*
java类
public class ConnFilter extends HttpServlet implements Filter {
public void doFilter(ServletRequest request,ServletResponse response,
FilterChain filterchain) throws IOException,ServletException
{
try
{
filterchain.doFilter(request,response);此处为过滤链 理解为请求通过该过滤继续前行 可在此处加上判断 如果TRUE执行该语句 有过FALSE 则直接跳转其他页面 常用于判断是否有权限进入某页面
}
finally
{
DBUtils.close();
}
}
更多文章:
javascript定时器(如何在JavaScript中使用定时器)
2024年5月16日 06:48
electronic wechat(数字货币是什么意思 与支付宝,微信支付有什么不同)
2024年6月15日 18:12
爱心代码手机版用什么打开?oppo手机工程模式代码 这些代码让你更了解你的手机
2024年6月12日 16:57
sorted安卓版(Python中怎么向sorted()传递参数reverse=True)
2024年5月16日 10:10
一个介于0至5之间的字符串是什么(0和5之间的字符串是什么)
2024年7月28日 12:06
VBA中如何使用and函数?Excel VBA系列之自定义函数
2024年8月6日 01:21
python 数组赋值(python用for循环怎么给给数组赋值)
2024年7月18日 07:45
数学ppt模板免费下载 素材(免费ppt模板在哪下载,找免费ppt模板)
2024年6月24日 07:50
libevent 多线程(libevent库base是多线程安全的吗)
2024年6月26日 10:42
bigdecimal 加减乘除(bigdecimal加运算)
2024年7月13日 14:18
reactor模式是设计模式么(什么是reactor模式和proactor模式)
2024年8月4日 02:45
detachment(电影超脱detachment经典的英文台词)
2024年7月21日 04:42
legacy(legacy是什么意思 解析legacy一词的含义)
2024年9月8日 18:05