filter
- Filter :过滤器,过滤请求和响应。
- web三大组件
- Servlet
- Filter:是用来执行过滤任务的对象,作用于
1) 请求一个资源(动态资源servlet,jsp,静态资源)
2)来自于一个资源的响应
3)两个都可以
filter过滤请求和响应
1)filter可以拦截请求(request),可以修改请求头,请求内容
2)filter可以拦截来自服务器的响应(response),可以修改响应头和响应内容
3)放行请求
- Listener
- filter执行原理
- 未加过滤器
- 加过滤器
- filter的执行周期
- 创建-初始化:服务器已启动,(项目加载进服务器),创建filter对象
- 每次拦截都执行:doFilter方法
- 销毁:项目从服务器中卸载(destory)
- filter-urlpatter配置
- 精确匹配:写要拦截的资源的详细路径 /hello.jsp /page/a.jsp
<url-pattern>/pages/a.jsp</url-pattern>
- 路径匹配:/路径名/* 拦截所有访问(路径名)下的资源,*表示所有
<url-pattern>/pages/*</url-pattern>
- 后缀匹配:*.后缀名 所有已给定的后缀结尾的都拦截
<url-pattern>*.jsp</url-pattern>
- filter能拦截的资源:
<!--并不能拦截所有可拦截的类型文件 --> <url-pattern>*.*</url-pattern>
- 通过request拦截
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest req=(HttpServletRequest) request; String uri=req.getRequestURI(); StringBuffer url=req.getRequestURL(); System.out.println("过来的请求uri:"+uri); System.out.println("过来的请求url:"+url); if(uri.endsWith("jsp")){ System.out.println("拦截jsp结尾的"); }else{ chain.doFilter(request, response); } }
- filter放行之前写中文有乱码
- filterConfig
public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub //FilterConfig是封装filter配置的信息 String filterName=filterConfig.getFilterName();//filter别名 //filter初始化参数 String filterParameter=filterConfig.getInitParameter("username"); //ServletContext-->对应我们的web应用 ServletContext servletContext=filterConfig.getServletContext(); //获取web初始化参数 String initParameter=servletContext.getInitParameter("user"); System.out.println("filterParameter"+filterParameter+" "+"initParameter"+initParameter); }
- filter链(Bfilter配置在Afilter前)
- dispatcher配置
web.xml
<!-- 全局错误页面配置 --> <error-page> <!-- 错误发生代码 404 500 等 --> <error-code>500</error-code> <!-- 指定发生错误以后的页面 --> <location>/test.jsp</location> </error-page>
<filter-mapping> <filter-name>Bfilter</filter-name> <url-pattern>/pages/a.jsp</url-pattern> <!-- dispatcher 可以设置多个,告诉服务器都拦截哪些方法到达的资源 - FORWARD:拦截转发过来的 - INCLUDE:拦截包含的,包含这个地址的会被拦截,拦截动态包含,不拦截静态包含 - REQUEST:直接请求这个地址会被拦截,默认的 get post - ASYNC: - ERROR:发生错误,去全局配置的一个错误页面会被拦截,不是errorPage指向的页面(转发得到的),指的是全局的配置 --> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>
```<dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher>