目录

基础

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

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

实例

package per.liyue.code.filter_demo;
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;
/*
* 过滤器例子:
* 1.普通的Java类实现javax.servlet.Filter接口
* 2.这是一个特殊的servlet
*/
public class HelloFilter implements Filter{
/*
* 过滤器在服务器启动的过程中就创建了,这个不同于普通的servlet,servlet在访问请求的时候创建,除非在配置中设置
*/
public HelloFilter(){
System.out.println("1.构造过滤器。。。");
} @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("2.初始化过滤器,实现一些过滤器的初始化工作...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("3.进入过滤器,实现过滤...");
//过滤完成后调用servlet
//如果有其他的过滤器,则进入其他的过滤器,最后才进入servlet chain.doFilter(request, response);
System.out.println("5.过滤器中完成了servlet的代码...");
}
@Override
public void destroy() {
System.out.println("6.销毁过滤器...");
}
}
package per.liyue.code.filter_demo;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { /**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("4.进入servlet,执行servlet本身内容...");
} }
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>WebDemo1</display-name> <!-- 过滤器配置 -->
<!-- 过滤器本身的设置 -->
<filter>
<!-- 过滤器内部名称 -->
<filter-name>HelloFilter??</filter-name>
<!-- 过滤器类名称 -->
<filter-class>per.liyue.code.filter_demo.HelloFilter</filter-class>
</filter>
<!-- 过滤器路径配置 -->
<filter-mapping>
<!-- 过滤器内部名称 -->
<filter-name>HelloFilter??</filter-name>
<!-- 过滤器所有的servlet -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 过滤器对应的servlet -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>per.liyue.code.filter_demo.HelloServlet</servlet-class>
</servlet>
<!-- 过滤器对应的servlet地址 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping> </web-app>

图解

核心API

interface Filter过滤器接口

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

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

现在xml中配置初始化参数

<!-- 过滤器配置 -->
<filter>
<!-- 配置初始化参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>path</param-name>
<param-value>c:/...</param-value>
</init-param> <!-- 内部名称 -->
<filter-name>hello_filter</filter-name>
<!-- 过滤器类的全名 -->
<filter-class>cn.itcast.a_filter_hello.HelloFilter</filter-class>
</filter>
<filter-mapping>
<!-- filter内部名称 -->
<filter-name>hello_filter</filter-name>
<!-- 拦截所有资源 -->
<url-pattern>/*</url-pattern>
</filter-mapping>

再到过滤器中获取

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

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

指定过滤

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

REQUEST

  • 拦截转发:

FORWARD

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

INCLUDE

  • 拦截声明式异常信息:

    ERROR

    Demo:
<!-- 配置第二个过滤器 -->
<!-- 演示: 拦截指定的请求 -->
<filter>
<filter-name>hello_filter2</filter-name>
<filter-class>cn.itcast.a_filter_hello.HelloFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>hello_filter2</filter-name>
<!-- 1. 拦截所有
<url-pattern>/*</url-pattern>
--> <!-- 2. 拦截指定的jsp
<url-pattern>/index.jsp</url-pattern>
<url-pattern>/list.jsp</url-pattern>
-->
<!-- 拦截所有的jsp
<url-pattern>*.jsp</url-pattern>
-->
<!-- 3. 根据servlet的内部名称拦截
<servlet-name>IndexServlet</servlet-name>
-->
<!-- 拦截指定的servlet
<url-pattern>/index</url-pattern>
--> <!-- 4. 指定拦截指定的类型 -->
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

常见问题:

  • 过滤器:

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

  • 连接池:

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

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

// 设置POST提交的请求的编码
request.setCharacterEncoding("UTF-8");
// 设置相应体的编码
response.setCharacterEncoding("UTF-8");
// 设置页面打开时候时候的编码格式、设置相应体的编码
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. CRM 2016 一个IFrame页面,执行另一IFrame页面的函数

    如果IFrame_A  想执行 IFrame_B 中 RefreshSelf() 函数,可以按以下方法写: 此js代码写在 IFrame_A 中 parent.Xrm.Page.getControl( ...

  2. MySQL字符集及校对规则的理解

      阅读目录:MySQL的字符集和校对规则 MySQL的字符集 MySQL与字符集 正确使用字符集 MySQL客户端与字符集 字符集编码转换原理 字符集常见处理操作 字符集的正确实践 MySQL的校对 ...

  3. nodejs运行的两种方式<小记>

    在mac上: 1.方式一:使用IDE运行 配置需要运行的js文件: 配置并运行 ①配置运行的js文件和运行的文件不一致时会导致报错.如图备注 ②当运行另一个文件提示端口8080被占用 ,需要改为其他端 ...

  4. truncate(can)

    1. 如果给了参数, 从头截取到参数位置 2. 如果不给参数, 从头截取到光标 f = open("司马光砸缸", mode="r+", encoding=&q ...

  5. SOA, EDA, 和 ESB

    SOA----面向服务架构,实际上强调的是软件的一种架构,一种支撑软件运行的相对稳定的结构,表面含义如此,其实SOA是一种通过服务整合来解决系统集成的一种思想.不是具体的技术,本质上是一种策略.思想. ...

  6. springboot中JPA的应用

    1.JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主要是为了简 ...

  7. 【Selenium-WebDriver自学】出现的问题和解决方案(十七)

    ==================================================================================================== ...

  8. android 开发 实现一个进入相机拍照后裁剪图片或者进入相册选中裁剪图片的功能

    实现思维路径: 以进入相机拍照的思维路线为例子: 1.进入app 2.判断之前是否保存头像,如果有就显示历史图像 (下面代码中在getOldAvatar();方法中执行这个逻辑) 3.点击更换图像的B ...

  9. elasticssearch+kibanna入门(撰写中)

    看到一篇elasticssearch+kibanna的文章,觉得很好,不过例子是python的,所以使用java自己安装一下: https://mp.weixin.qq.com/s?__biz=MjM ...

  10. spring 之 factory-bean & factory-method

    这两者常常是一起出现的,或者说他们经常是一起被使用的.但是其实是分为了两种情况: 1 同时使用factory-bean 和 factory-method 如果,我们在一个bean 元素上同时配置 fa ...