目录

基础

过滤器相当于门的作用,用于在servlet获取之前,完成定义的过滤操作

  • 过滤器是一个特殊的servlet类
  • 过滤器实现接口javax.servlet.Filter

实例

  1. package per.liyue.code.filter_demo;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. /*
  10. * 过滤器例子:
  11. * 1.普通的Java类实现javax.servlet.Filter接口
  12. * 2.这是一个特殊的servlet
  13. */
  14. public class HelloFilter implements Filter{
  15. /*
  16. * 过滤器在服务器启动的过程中就创建了,这个不同于普通的servlet,servlet在访问请求的时候创建,除非在配置中设置
  17. */
  18. public HelloFilter(){
  19. System.out.println("1.构造过滤器。。。");
  20. }
  21. @Override
  22. public void init(FilterConfig filterConfig) throws ServletException {
  23. System.out.println("2.初始化过滤器,实现一些过滤器的初始化工作...");
  24. }
  25. @Override
  26. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  27. throws IOException, ServletException {
  28. System.out.println("3.进入过滤器,实现过滤...");
  29. //过滤完成后调用servlet
  30. //如果有其他的过滤器,则进入其他的过滤器,最后才进入servlet chain.doFilter(request, response);
  31. System.out.println("5.过滤器中完成了servlet的代码...");
  32. }
  33. @Override
  34. public void destroy() {
  35. System.out.println("6.销毁过滤器...");
  36. }
  37. }
  1. package per.liyue.code.filter_demo;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class HelloServlet extends HttpServlet {
  9. /**
  10. * The doGet method of the servlet. <br>
  11. *
  12. * This method is called when a form has its tag value method equals to get.
  13. *
  14. * @param request the request send by the client to the server
  15. * @param response the response send by the server to the client
  16. * @throws ServletException if an error occurred
  17. * @throws IOException if an error occurred
  18. */
  19. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. System.out.println("4.进入servlet,执行servlet本身内容...");
  21. }
  22. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. id="WebApp_ID" version="3.0">
  6. <display-name>WebDemo1</display-name>
  7. <!-- 过滤器配置 -->
  8. <!-- 过滤器本身的设置 -->
  9. <filter>
  10. <!-- 过滤器内部名称 -->
  11. <filter-name>HelloFilter??</filter-name>
  12. <!-- 过滤器类名称 -->
  13. <filter-class>per.liyue.code.filter_demo.HelloFilter</filter-class>
  14. </filter>
  15. <!-- 过滤器路径配置 -->
  16. <filter-mapping>
  17. <!-- 过滤器内部名称 -->
  18. <filter-name>HelloFilter??</filter-name>
  19. <!-- 过滤器所有的servlet -->
  20. <url-pattern>/*</url-pattern>
  21. </filter-mapping>
  22. <!-- 过滤器对应的servlet -->
  23. <servlet>
  24. <servlet-name>HelloServlet</servlet-name>
  25. <servlet-class>per.liyue.code.filter_demo.HelloServlet</servlet-class>
  26. </servlet>
  27. <!-- 过滤器对应的servlet地址 -->
  28. <servlet-mapping>
  29. <servlet-name>HelloServlet</servlet-name>
  30. <url-pattern>/HelloServlet</url-pattern>
  31. </servlet-mapping>
  32. </web-app>

图解

核心API

interface Filter过滤器接口

  • void init(filterConfig); 初始化方法,在服务器启动时候执行
  • void doFilter(request,response,filterChain); 过滤器拦截的业务处理方法
  • void destroy(); 销毁过滤器实例时候调用

interface FilterConfig获取过滤器初始化信息

现在xml中配置初始化参数

  1. <!-- 过滤器配置 -->
  2. <filter>
  3. <!-- 配置初始化参数 -->
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>path</param-name>
  10. <param-value>c:/...</param-value>
  11. </init-param>
  12. <!-- 内部名称 -->
  13. <filter-name>hello_filter</filter-name>
  14. <!-- 过滤器类的全名 -->
  15. <filter-class>cn.itcast.a_filter_hello.HelloFilter</filter-class>
  16. </filter>
  17. <filter-mapping>
  18. <!-- filter内部名称 -->
  19. <filter-name>hello_filter</filter-name>
  20. <!-- 拦截所有资源 -->
  21. <url-pattern>/*</url-pattern>
  22. </filter-mapping>

再到过滤器中获取

  1. @Override
  2. public void init(FilterConfig filterConfig) throws ServletException {
  3. System.out.println("2. 执行过滤器初始化方法");
  4. // 获取过滤器在web.xml中配置的初始化参数
  5. String encoding = filterConfig.getInitParameter("encoding");
  6. System.out.println(encoding);
  7. // 获取过滤器在web.xml中配置的初始化参数 的名称
  8. Enumeration<String> enums = filterConfig.getInitParameterNames();
  9. while (enums.hasMoreElements()){
  10. // 获取所有参数名称:encoding、path
  11. String name = enums.nextElement();
  12. // 获取名称对应的值
  13. String value = filterConfig.getInitParameter(name);
  14. System.out.println(name + "\t" + value);
  15. }
  16. }

interface FilterChain 过滤器参数,一个个过滤器形成执行链

指定过滤

  • 默认拦截的类型:(直接访问或者重定向)

REQUEST

  • 拦截转发:

FORWARD

  • 拦截包含的页面(RequestDispatcher.include(/page.jsp); 对page.jsp也执行拦截)

INCLUDE

  • 拦截声明式异常信息:

    ERROR

    Demo:
  1. <!-- 配置第二个过滤器 -->
  2. <!-- 演示: 拦截指定的请求 -->
  3. <filter>
  4. <filter-name>hello_filter2</filter-name>
  5. <filter-class>cn.itcast.a_filter_hello.HelloFilter2</filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>hello_filter2</filter-name>
  9. <!-- 1. 拦截所有
  10. <url-pattern>/*</url-pattern>
  11. -->
  12. <!-- 2. 拦截指定的jsp
  13. <url-pattern>/index.jsp</url-pattern>
  14. <url-pattern>/list.jsp</url-pattern>
  15. -->
  16. <!-- 拦截所有的jsp
  17. <url-pattern>*.jsp</url-pattern>
  18. -->
  19. <!-- 3. 根据servlet的内部名称拦截
  20. <servlet-name>IndexServlet</servlet-name>
  21. -->
  22. <!-- 拦截指定的servlet
  23. <url-pattern>/index</url-pattern>
  24. -->
  25. <!-- 4. 指定拦截指定的类型 -->
  26. <url-pattern>/*</url-pattern>
  27. <dispatcher>REQUEST</dispatcher>
  28. <dispatcher>FORWARD</dispatcher>
  29. </filter-mapping>

常见问题:

  • 过滤器:

方法参数没有自动命名,说明没有关联源码---->关联tomcat或servlet源代码

  • 连接池:

多刷新几次,报错---->连接没关

  1. QueryRunner qr = new QueryRunner();
  2. qr.update(con,sql);
  3. // 这里con一定要关闭
  4. ---->注意:dataSource 确定一个项目创建一次
  5. QueryRunner qr = new QueryRunner(dataSource);
  6. ---->修改连接池参数配置
  • 编码

  1. // 设置POST提交的请求的编码
  2. request.setCharacterEncoding("UTF-8");
  3. // 设置相应体的编码
  4. response.setCharacterEncoding("UTF-8");
  5. // 设置页面打开时候时候的编码格式、设置相应体的编码
  6. response.setContentType("text/html;charset=UTF-8");

** 开发中:工作区间编码、项目编码、request/response、数据库编码一致!**

15.过滤器-基础.md的更多相关文章

  1. Servlet过滤器基础及使用场景

    Servlet过滤器详解 一.过滤器基础 1.Servlet过滤器是Servlet的一种特殊用法,主要用来完成一些通用的操作.比如编码的过滤,判断用户的登陆状态等等.Servlet过滤器的适用场合: ...

  2. intellij idea 15 修改基础配置加载路径

    一.概述 intellij idea 15 默认配置的启动加载路径是"C:\Users\Administrator.IntelliJIdea15",这样会导致占用C盘的空间越来越多 ...

  3. 一步步学习ASP.NET MVC3 (15)——过滤器

    请注明转载地址:http://www.cnblogs.com/arhat 今天老魏和大家一起讨论一下ASP.NET MVC中非常重要的一个知识:"过滤器".那么这个"过滤 ...

  4. angularJS自定义 过滤器基础

    先写个简单的例子,该过滤器是指定规定的字符串长度: html: <div ng-app="app" ng-controller="ctrl"> &l ...

  5. JAVA入门[15]-过滤器filter

    一.过滤器 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的: 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理这些响应. 参考:http:/ ...

  6. Python 15 html 基础 - CSS &javascript &DOM

    本节内容 CSS基础 javascript基础 DOM 前言,这边这块楼主已经很熟悉了,CSS天天用到,简单的一些javascript也是所以就挑点重点说了.然后就是dom不怎么用,但是其实也用不到, ...

  7. 第七章 过滤器基础 Filter

    简介:SUN从Servlet2.3开始添加一项激动人心的功能,就是过滤器(Filter).WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图 ...

  8. AngularJs filter 过滤器基础【转】

    Filter Ng里的过滤器. currency:把一个数字格式化成货币模式(如$1,234.56).当没有提供任何货币符号时,默认使用当前区域的符号. 使用: HTML:{{ currency_ex ...

  9. Python基础.md

    数据结构 列表 访问 list1 = ['java','C','C++','Python'] In [10]: list1[1] Out[10]: 'C' In [11]: list1[-1] Out ...

随机推荐

  1. ORACLE 通过连接查询更新 update select

    注意:  关键的地方是where 语句的加入. 在11G中, 如果不加11G , 或造成除匹配的行数更新为相应的值之后, 其余的会变成负数. 所以,执行前需要测试, 普通办法就是:  先查看需要更新的 ...

  2. HADOOP+SPARK+ZOOKEEPER+HBASE+HIVE集群搭建(转)

    原文地址:https://www.cnblogs.com/hanzhi/articles/8794984.html 目录 引言 目录 一环境选择 1集群机器安装图 2配置说明 3下载地址 二集群的相关 ...

  3. cocos源码分析--ClippingNode绘图原理

    在OpenGL 绘制过程中,与帧缓冲有关的是模版,深度测试,混合操作.模版测试使应用程序可以定义一个遮罩,在遮罩内的片段将被保留或者丢弃,在遮罩外的片段操作行为则相反.深度测试用来剔除那些被场景遮挡的 ...

  4. matlab 画图参考小程序

    x=0.1:0.1:0.9; a=[41.37,44.34,44.34,44.66,44.66,44.66,98.85,98.85,98.85];%xxxxxx b=[22.10,22.39,22.3 ...

  5. h5登录页面

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. SP8093 JZPGYZ - Sevenk Love Oimaster(SAM)

    /* 打模板题啊 每个串影响到的集合直接枚举跳parent处理即可 */ #include<cstdio> #include<algorithm> #include<cs ...

  7. 关于python中生成器之Send方法

    #send主要是用于外部与生成器对象的交互def func1(): # 生成器函数 print("ok1") x = 10 # 函数内局部变量x赋值为10 print(x) x = ...

  8. java的list遍历

    for(String str : list) {//增强for循环,其内部实质上还是调用了迭代器遍历方式,这种循环方式还有其他限制,不建议使用. System.out.println(str); } ...

  9. 使用Inent 携带 Bundle 携带 数组 传递给另外一个activity

    在activity发送数组: public static String [] PhoneAndTime = new String[2]; //new 新的Intent Intent data = ne ...

  10. 【每日一学】pandas_透视表函数&交叉表函数

    每日一悟 [分开工作内外8小时] 前一个月,我经常把工作内的问题带到路上.地铁上.睡觉前,甚至是周末. 然而很快发现,我工作外的成就几乎没有,而工作内的进展也并不理想. 仔细想想,工作外是需要学新东西 ...