Filter---javaweb的过滤器
1.Filter是什么?
- Filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特殊的功能。
- 在Servlet API中定义了三个接口类来供开发人员编写Filter程序:Filter,FilterChain,FilterConfig。
- Filter程序是一个实现了Filter接口的java类,与servlet程序相似,它由servlet容器进行调用和执行。
- Filter要在web.xml文件中进行注册和设置它所能拦截的资源:Filter程序可以拦截Jsp,Servlet,静态图片文件和静态html文件。

2.如何创建一个Filter?
①创建一个Filter类:实现Filter接口(与开发Servlet不同的是,Filter接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现Filter接口。)
②在web.xml文件中配置并映射该Filter,其中url-pattern指定该Filter可以拦截哪些资源,即可以通过哪些url访问到该Filter。
<!-- 注册Filter -->
<filter>
<filter-name>filterTest</filter-name>
<filter-class>com.javaweb.Filter.filterTest</filter-class>
</filter>
<!-- 映射Filter -->
<filter-mapping>
<filter-name>filterTest</filter-name>
<url-pattern>/jspTest/includeTest1.jsp</url-pattern>
</filter-mapping>
3.Filter相关的API
①public void init(FilterConfig filterConfig):类似于Servlet的init方法,在创建Filter对象后,立即被调用,且只被调用一次,Filter对象在Servlet容器中加载当前web应用时即被创建,即Filter实例是单例的。
FilterConfig类似于ServletConfig;可以在web.xml文件中配置当前Filter的初始化参数,配置方式和servlet的配置方式类似。
<filter>
<filter-name>filterTest</filter-name>
<filter-class>com.javaweb.Filter.filterTest</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>root</param-value>
</init-param>
</filter>
②public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
真正Filter的逻辑代码需要编写在该方法中,每次拦截都会调用该方法。
FilterChain:Filter链,多个Filter可以构成一个Filter链。
doFilter(ServletRequest request, ServletResponse response):把请求传给Filter链的下一个Filter,若当前Filter是Filter链的最后一个Filter,将把请求给目标Servlet或jsp。
多个Filter拦截的顺序和<filter-mapping>配置的顺序有关,靠前的先被调用。
③public void destroy():释放当前Filter所占用的资源的方法。在Filter被销毁之前被调用,且只被调用一次。
4.示例代码
实现的功能:
①login.jsp请求提交到hello.jsp。该页面中有两个text,分别为username和password。
②userNameFilter,passWordFilter拦截login.jsp的请求页面,即hello.jsp。
③userNameFilter:若username不等于Tom,则将请求转发给login.jsp,并提示用户名不正确,若等于“Tom”,则把请求转发给下一个Filter(使用FilterChain实现)。
④passWordFilter:若password不等于1234,则将请求转发到login.jsp,并提示密码不正确,若等于1234,则把请求转发到目标页面。
登录页面:login.jsp
<body>
<font color="red">${requestScope.message}</font>
<br><br>
<form action="http://localhost:8080/MyWebProject/jspTest/hello.jsp" method="post">
username:<input type="text" name="username"/>
password:<input type="password" name="password"/>
<input type="submit" value="Submit" />
</form>
</body>
登录成功跳转的页面:hello.jsp
<body>
hello,${param.username}
</body>
用户名不正确拦截的Filter实现:userNameFilter.java
package com.javaweb.Filter; 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; public class userNameFilter implements Filter {
@Override
public void destroy() { } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String initUser=filterconfig.getInitParameter("username");
String username=request.getParameter("username");
if(!initUser.equals(username)){
request.setAttribute("message","用户名不正确");
//request.getAttribute("message");
request.getRequestDispatcher("/jspTest/login.jsp").forward(request,response);
return;
}
chain.doFilter(request,response); }
private FilterConfig filterconfig;
@Override
public void init(FilterConfig filterconfig) throws ServletException {
this.filterconfig=filterconfig; } }
密码不正确拦截的实现功能:passWordFilter.java
package com.javaweb.Filter; 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; public class passWordFilter implements Filter { @Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String initPassWord=filterconfig.getServletContext().getInitParameter("password");
String password=request.getParameter("password");
if(!initPassWord.equals(password)){
request.setAttribute("message","密码不正确");
//request.getAttribute("message");
request.getRequestDispatcher("/jspTest/login.jsp").forward(request,response);
return;
}
chain.doFilter(request,response);
}
private FilterConfig filterconfig;
@Override
public void init(FilterConfig filterconfig) throws ServletException {
this.filterconfig=filterconfig;
}
}
在web.xml中进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<context-param>
<param-name>password</param-name>
<param-value>1234</param-value>
</context-param>
<filter>
<filter-name>userNameFilter</filter-name>
<filter-class>com.javaweb.Filter.userNameFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>Tom</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>userNameFilter</filter-name>
<url-pattern>/jspTest/hello.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>passWordFilter</filter-name>
<filter-class>com.javaweb.Filter.passWordFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>passWordFilter</filter-name>
<url-pattern>/jspTest/hello.jsp</url-pattern>
</filter-mapping>
</web-app>
注意:EL表达式中,param和requestScope的区别。
在看param和requestScope之前,不妨先了解下request:
1. request对象通常用来接收客户端提交到服务端的数据,如:在servlet或者action中可以用request.getParameter()的方法获取获取参数内容;
2. requestScope通常是在servlet或者action的服务端中通过request.setAttribute()方法把数据放到request对象中供客户端获取,然后客户端获取的方法就是requestScope.getAttribute()。
1. getParameter:
可以获取URL中传递过来的String参数,如:http://www.baidu.com?username=abc 中的abc;
提示:对于POST/GET提交的表单,在服务器端我们都可以通过request.getParameter获取表单中的值。
当我们在进行一个请求重定向(redirect)的时候,我们可以通过request.setParameter传递参数,如果用request.setAttribute在重定向页面是取不到值的(重定向是两个request请求对象)。
2. getAttribute:
获取的是一个对象(Object)。
当我们进行一个请求转发(forward)的时候,可以使用request.setAttribute传递参数。
3. requestScope:
是EL表达式中的一个隐含对象,类似request,如:${requestScope.username} 表示在request域中取得username属性所对应的值,相当于request.getAttribute(“username”)。
4. param:
${param.username} 可理解为:request.getParameter(“username”);
结论:
${param.name} 等价于 request.getParamter("name"),(返回字符串)这两种方法一般用于服务器从页面或者客户端获取的内容,这些内容都是String的。
${requestScope.name} 等价于 request.getAttribute("name"),(返回对象)一般是从服务器传递结果到页面,在页面中取出服务器端保存的值!
Filter---javaweb的过滤器的更多相关文章
- Javaweb基础--->过滤器filter(转发)
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- Introducation of Servlet filter(servlet过滤器介绍 )
本文章向大家介绍Servlet Filter,主要包括 Servlet Filter使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下. 过滤器是一个可以转换 ...
- JavaWeb基础—过滤器Filter
一.概念 JavaWeb三大组件之一(组件都有一个特性,需要在web.xml中配置) 过滤器:会在一组资源(jsp servlet等)的前面执行,可以让请求得到目标资源,也可以终止请求,不再继续 也就 ...
- JavaWeb中过滤器Filter的使用示例
https://github.com/YouXianMing/Java-Web-Study/tree/master/Servlet-Filter 过滤器示例基于以下流程 测试效果如下 web.xml配 ...
- JavaWeb的过滤器Filter
Filter的作用是在请求到达web资源(HTML.css.Servlet.Jsp)之前拦截,做一个预处理. 创建一个类实现Filter接口,在web.xml中对文件进行配置 <filter&g ...
- JavaWeb中过滤器Filter的url-pattern设置
源码 https://github.com/YouXianMing/Java-Web-Study/tree/master/Servlet-Filter-UrlPattern Filter顺序以及url ...
- [javaweb]Java过滤器与包装设计模式的实用案例.
在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...
- Filter登录验证过滤器(全局)
通过Filter来定义一个登录验证过滤器,这是就不需要在每一个JSP页面添加判断用户合法性的代码了. 以下示例中包含了5个文件,一个是登录表单LoginForm.jsp,一个是登录判断页LoginCo ...
- JavaWeb 之过滤器
1. 什么是过滤器 Servlet 是用来处理请求的, 过滤器是用来拦截请求的. 当用户请求某个 Servlet 时,会先执行部署在这个请求上的 Filter, 而 Filter 决定是否调用 Ser ...
- IT兄弟连 JavaWeb教程 过滤器3
过滤器案例:字符编码过滤器 在JavaWeb程序开发中,由于Web容器内部所使用编码格式并不支持中文字符集,所以,处理浏览器请求中的中文数据就会出现乱码现象. 图3 无字符编码过滤器 从上图可以看出 ...
随机推荐
- 鼠标点击按钮控制图片移动或者键盘控制图片移动(解决问题:parseInt失效问题,用Number)
在测试用鼠标点击按钮,使图片左右上下移动: 效果如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> ...
- Git远程库
要关联一个远程主机,使用命令 git remote add origin <url> : 删除远程主机,使用命令 git remote rm origin ; git push 的一般形式 ...
- L2-3 名人堂与代金券 (25 分)
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int N, ...
- python __getattribute__、__getattr__、__setattr__详解
__getattribute__ 官方文档中描述如下: 该方法可以拦截对对象属性的所有访问企图,当属性被访问时,自动调用该方法(只适用于新式类).因此常用于实现一些访问某属性时执行一段代码的特性. 需 ...
- spark第十一篇:spark-submit命令支持选项
[root@linux-node3 bin]# ./spark-submit --help Usage: spark-submit [options] <app jar | python fil ...
- 关于chart不能自行切换出现的报错现象
1.echart 页面菜单不能切换,line和bar不能自行切换 页面上报错误 bar has not been reqired 解决办法,加载bar <script type=" ...
- java跨库事务Atomikos
1:引入额外的jar <dependency> <groupId>com.atomikos</groupId> <artifactId>transact ...
- TXSQL:云计算时代数据库核弹头——云+未来峰会开发者专场回顾
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 5月23-24日,以"焕启"为主题的腾讯"云+未来"峰会在广州召开,广东省各级政府机构领导.海内外业 ...
- Mac新手问题
[现象:]MAC下checkout代码时,报svn:E170013-unable to connect to a repository at url xxx, svn:E1700113: unable ...
- cut、grep和排序命令
1.cut 对于行进行操作 cut -d ':' -f 2 以':'为分隔符,切出第二部分的所有行 cut -c 12- 从第12字符往后的字符所有行 2.grep grep '选取的串' 选出所有含 ...