java过滤器filter使用
一:filter:过滤器,拦截servlet的请求和响应。
1、
package jd.com.filter; import javax.servlet.*;
import java.io.IOException; public class MyFilter implements Filter {
@Override
public void destroy() { } @Override
public void init(FilterConfig filterConfig) { } @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { try {
System.out.println("请求到拦截器。");
//放行请求和响应。
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("响应到拦截器。");
}catch (Exception ex){
ex.printStackTrace();
throw new RuntimeException(ex+"run ereror");
} }
}
需要继承抽象类Filter,需要重写init和destory方法以及doFilter()方法。如果想放行请求和响应需要调用类FilterChain的方法doFilter(servletRequest,serletRespone)。
servlet:
package jd.com.filter; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet(name = "ServletFilter")
public class ServletFilter extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求到servlet。");
}
}
2、注册serlet和Filter。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>ServletFilter</servlet-name>
<servlet-class>jd.com.filter.ServletFilter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletFilter</servlet-name>
<url-pattern>/test/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>jd.com.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/test/</url-pattern>
</filter-mapping> </web-app>
想flter过滤那个url需要在url-pattern里写那个url!

图示:

2、FilterChain 过滤链
当我们的jsp或者servlet被多个过滤器使用的时候,整个请求和响应形成的链叫做过滤链。
通过过滤链FilterChain的doFilter方法,将一个请求从一个过滤器放行到下一个过滤器,直到最后一个过滤器被调用放行的时候,才到达最后的servlet或者jsp。
doFilter()放行方法。区别于咱们重写抽象方法Filter的doFiltter()方法,一个是服务器调用一个是FilterChain调用。
3、多个过滤器作用一个url的执行顺序(filter-mapping在web.xml的顺序决定):
url匹配规则:
1)完全匹配 : 必须以"/"开头 例如:"/a"
2)目录匹配: 必须以"/"开头,以"*"结束,例如:"/a/*"
3)后缀名匹配: 以“*”开头,以"jsp、do、action"结束的。例如:“”*.jsp *.do *.action“”
匹配规则:
以精确匹配>最长路径匹配>后缀名匹配>默认匹配
例1:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,不会去管servletB。
例2:比如servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
例3: 比如servletA的url-pattern:*.action ,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servletB。
filter匹配规则:
例子:Afilter urlpattern:/*
Bfilter urlpattern::/a/c
servlet的url为:/a/c的时候,如上filter都会被使用,那Afilterr和Bfilter执行顺序是什么呢?
web.xml注册顺序:
<filter-name>FilterA</filter-name>
<filter-class>jd.com.mapFilter.FilterA</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterA</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>FilterB</filter-name>
<filter-class>jd.com.mapFilter.FilterB</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterB</filter-name>
<url-pattern>/a/c</url-pattern>
</filter-mapping>
实际输出结果:
(响应回来的时候先经过B在经过A)
也就是说,执行filter的顺序是按照,在web.xml中的filter-mapping的顺序来决定,我们的这个2个顺序调换,看下输出:
<filter>
<filter-name>FilterA</filter-name>
<filter-class>jd.com.mapFilter.FilterA</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterB</filter-name>
<url-pattern>/a/c</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>FilterA</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>FilterB</filter-name>
<filter-class>jd.com.mapFilter.FilterB</filter-class>
</filter>

4)filter在web.xml其他标签:
1、<servlet-name>Servletdemo1</servlet-name>位置 <filter-mapping>内表示匹配那个servlet。是servletname不是相对路径。

注意:
如果一个filter-mapping其中已经存在url-pattern 不要在存在servlet-name,在不同的版本中会重复执行2次过滤器!!
2、<dispatcher></dispatcher> dispatch filter作用那种请求。
请求(3和4了解):1、REQUEST:从浏览器发送过来的请求,这个filter的默认作用请求。
2、FORWARD:转发过来的请求。
3、ERROR:因为服务器错误而发送过来的请求。
4、INCLUDE:包含过来的请求。
1)默认情况(request)
demo1:
package jd.com.otherTag; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet(name = "Servletdemo1")
public class Servletdemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求进入Servletdemo1");
request.getRequestDispatcher("/a/b").forward(request,response);
}
}
demo2:
package jd.com.otherTag; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet(name = "Servletdemo2")
public class Servletdemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("进入Servletdemo2 请求");
}
}
web.xml
<servlet>
<servlet-name>Servletdemo1</servlet-name>
<servlet-class>jd.com.otherTag.Servletdemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletdemo1</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<filter>
<filter-name>demoFilter</filter-name>
<filter-class>jd.com.otherTag.demoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>demoFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Servletdemo2</servlet-name>
<servlet-class>jd.com.otherTag.Servletdemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletdemo2</servlet-name>
<url-pattern>/a/b</url-pattern>
</servlet-mapping>

注意:
因为filter的匹配url为/*所有 如果匹配的不是所有的话 需要注意的是filter的url和其他2个demo的url是包含关系。
<servlet>
<servlet-name>Servletdemo1</servlet-name>
<servlet-class>jd.com.otherTag.Servletdemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletdemo1</servlet-name>
<url-pattern>/a/c</url-pattern>
</servlet-mapping>
<filter>
<filter-name>demoFilter</filter-name>
<filter-class>jd.com.otherTag.demoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>demoFilter</filter-name>
<url-pattern>/a/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Servletdemo2</servlet-name>
<servlet-class>jd.com.otherTag.Servletdemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletdemo2</servlet-name>
<url-pattern>/a/b</url-pattern>
</servlet-mapping>
结果:

在转发的时候,没有经过demofilter,直接转发到servletdemo2.
解决方法:
默认情况下走的是请求是REQUEST,所以需要添加FORWARD的请求。注意需要写REQUEST请求,因为如果写其他请求默认请求不会生效。
<filter>
<filter-name>demoFilter</filter-name>
<filter-class>jd.com.otherTag.demoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>demoFilter</filter-name>
<url-pattern>/a/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
结果:

2)设置错误页。
<servlet>
<servlet-name>ServletError</servlet-name>
<servlet-class>jd.com.coding.ServletError</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletError</servlet-name>
<url-pattern>/c</url-pattern>
</servlet-mapping>
<error-page>
<error-code></error-code>
<location>/c</location>
</error-page>
package jd.com.coding; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet(name = "ServletError")
public class ServletError extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("亲访问的资源不存在!");
}
}
java过滤器filter使用的更多相关文章
- java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例
java 过滤器Filter: package com.sun.test.aircraft.filter;import javax.servlet.*;import java.io.IOExcepti ...
- java过滤器Filter笔记
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet, 静 ...
- java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序
过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt.紧接着执行chain.doFilter()之后的代码 ...
- XSS过滤JAVA过滤器filter 防止常见SQL注入
Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...
- 防止常见XSS 过滤 SQL注入 JAVA过滤器filter
XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往W ...
- java 过滤器filter使用案例
主要需要 过滤器类 和配置文件 1.过滤器类 SessionFilter package com.service; import javax.servlet.*; import javax.serv ...
- Java过滤器—Filter用法简介
一.什么是Filter? Filter译为过滤器. 由于年,Sun公司在Servlet2.3规范中添加了Filter功能,并在Servlet2.4中对Filter进行了细节上的补充. 二.运行原理: ...
- Java 过滤器Filter,Java Filter 不拦截某些请求 Java 过滤器支持Ajax请求
================================ ©Copyright 蕃薯耀 2020-01-10 https://www.cnblogs.com/fanshuyao/ 一.Java ...
- Java过滤器Filter使用详解
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6374212.html 在我的项目中有具体应用:https://github.com/ygj0930/Coupl ...
随机推荐
- java设计模式-----22、状态模式
概念: State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样. 根据这个概念,我们举个例子 public c ...
- 封装7z软件实现批量文件或目录压缩
哈哈,作为一个特别懒的运维人来说 兄弟我写了一个批量压缩文件或目录的小工具,用来批量压缩文件目录 弄一下,然后就不用管他了,后天看结果就好了 操作步骤: 1.选择想做压缩处理的根目录 2.选择你要的功 ...
- Python数据模型
引言 像大多数人一样,我在对一直传统的面向过程语言C一知半解之后,走进了面向对象的世界,尽管对OOP一无所知,还好Python还保留有函数式编程,这使得我才不那么抵触,直到现在,习惯了面向对象之后,也 ...
- Bootstrap+PHP实现多图上传
插件及源代码可以在这里下载 http://www.jq22.com/jquery-info5231下面是根据下载的demo进行补充:使用bootstrap界面美观,可预览,可拖拽上传,可配合ajax异 ...
- python 生成器 和生成器函数 以及各种推导式
一.生成器 本质就是迭代器. 我们可以直接执⾏__next__()来执⾏ 以下⽣成器 一个一个的创建对象 创建生成器的方式: 1.生成器函数 2.通过生成器 表达式来获取生成器 3.类型转换(看 ...
- Nginx 优化配置及详细注释
Nginx 的nginx.conf文件,是调优后的,具体影响已经写清楚注释,可以拿来用,有一些设置无效,我备注上了,不知道是不是版本的问题,回头查一下再更正. #普通配置 #==性能配置 #运行用户 ...
- [基础知识]在PeopleSoft中SMTP设置不生效如何查找问题
在PeopleSoft中如果配置了工作流邮件或者标准页面的通知,都是可以发送出邮件的,这些邮件都是由SMTP服务器发送.SMTP需要在APP服务器和PRCS服务器中配置. 如果无法从PeopleSof ...
- 只有mdf文件的恢复方法
EXEC sp_attach_single_file_db @dbname = 'AdventureWorksDW2012_Data',@physname = 'D:\Program Files (x ...
- android 所有焦点问题
一. 主动获取焦点 setFocusable(true); // 是设置能否获得焦点而已.. requestFocus(); //是让控件得到焦点 requestFocusI ...
- CSS 实例之打开大门
本个实例主要的效果如下图所示 本案例主要运用到了3D旋转和定位技术.具体步骤如下: 1.首先在页面主体加三个很简单的div标签: <div class="door"> ...