700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > web核心 8-filter过滤器 listener监听器 相对路径 绝对路径 项目名路径

web核心 8-filter过滤器 listener监听器 相对路径 绝对路径 项目名路径

时间:2018-09-21 18:52:42

相关推荐

web核心 8-filter过滤器 listener监听器  相对路径 绝对路径 项目名路径

内容介绍

1.Filter过滤器2.listener监听器

Filter过滤器

概述

web服务器端有三大技术:Servlet Filter Listener

Servlet:本质上是一个类,这个类需要实现Servlet接口规范作用:可以做浏览器和服务器之间的交互请求和响应

Filter:本质上是一个类,这个类需要实现Filter接口规范作用:对浏览器访问服务器资源时的一种拦截,符合条件才放行 不符合条件不放行访问资源资源:项目里面的资源 比如:Servlet html jsp js jpg...

作用

主要作用:拦截浏览器访问服务器的请求的

ps:也会拦响应,但是企业主要用于拦请求

filter的使用

1 xml配置文件方式(掌握)

创建一个java类,实现filter的接口在web.xml中配置filter要拦截的资源

2 注解配置方式(了解)

在自定义的filter类上添加注解:@WebFilter(urlPatterns = "/sd1")

filter的细节

1.filter不是对所有资源都拦截,需要拦截哪些资源都需要配置filter2.如果多个filter都对同一个资源拦截,那多个filter都会执行配置文件中:多个filter的执行顺序是web.xml的上下配置顺序注解中: 执行的顺序是按照filter文件名的自然排序顺序 3.如果filter放行,找的是看看有没有下一个过滤器执行,如果没有下一个过滤器才会执行服务器的资源

Filter的执行流程:(了解)

filter的生命周期(了解)

从filter的出生到filter的死亡 有3个方法伴随:init() destory() dofilter()服务器启动创建filter对象执行init方法浏览器访问到了匹配到的资源 执行dofilter方法 访问一次执行一次当服务器关闭的时候 执行destory方法 销毁当前filter关注点:doFilter核心过滤方法

filter生命周期方法中参数(了解)

方法:init(FilterConfig config)

参数:filterConfig 当前filter的配置对象

作用

1 可以获取到当前filter的名称 getFilterName()2 可以获取到ServletContext对象 getServletContext()

方法:doFilter(ServletRequest req, ServletResponse resp, FilterChain filterchain)

参数:request response filterchain

作用

1.request response之前怎么用 在filter中还怎么用

2.FilterChain:过滤器链对象 作用:维护过滤器的执行顺序的 核心放行方法: chain.dofilter(req,res)

Filter的配置

1.filter的资源路径配置(面试题)

有3种方式来配置filter的拦截路径

1.完全路径匹配: 以/开始 例如:/sd1 /a/b/c/sd1 匹配单一资源的匹配 注意:<url-pattern>标签可以出现多个2.目录匹配:以/开始 以*结尾 例如:/* /a/b/*匹配目录下的所有资源 3.扩展名匹配:不以/开始 以.结尾 例如:*.jsp *.jpg *.html 匹配一类资源的

2.filter的拦截方式配置

默认:filter只拦截浏览器过来的请求 不拦截服务器内部的请求(请求转发)

配置filter拦截服务器内部的请求

// 请求转发request.getRequestDispatcher("/sd4").forward(request,response);// 重定向response.sendRedirect(request.getContextPath()+"/sd4");

xml方式配置在<filter-mapping>的标签中添加标签<dispatcher>FORWARD</dispatcher>但是这种配置将filter默认的拦截方式给覆盖了 只会拦截服务器内部的请求 不会再拦截默认的浏览器请求了想让filter拦截服务器内部的请求又拦截浏览器过来的请求:<filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>FORWARD</dispatcher><dispatcher>REQUEST</dispatcher></filter-mapping>

注解方式配置@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})该注解配置filter既会拦截浏览器过来的请求 又会拦截服务器内部的请求

//为servlt统一处理请求和响应的中文乱码public class EncodeFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");servletResponse.setContentType("text/html;charset=utf-8");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}}

// xml方式(掌握) 注解方式(了解)/** xml方式:* 1 创建1个类实现filter接口(javax包下的)* 2 在web.xml中配置该filter要拦截的资源是谁** */import javax.servlet.*;import java.io.IOException;//@WebFilter(urlPatterns = "/sd1")public class MyFilter1 implements Filter{/** 执行时机:服务器启动创建该Filter执行init方法* 执行次数:1次* 执行者:tomcat** */@Override //filter的初始化方法public void init(FilterConfig filterConfig) throws ServletException {System.out.println("我出生了...555");//filterConfig:是当前filter的配置对象//1 可以获取当前filter的名字System.out.println(filterConfig.getFilterName());//2 获取域对象(ServletContext对象)System.out.println(filterConfig.getServletContext());}/** 执行时机:拦截住了匹配的资源就执行* 执行次数:访问一次 执行一次* 执行者:tomcat** */@Override //核心拦截方法public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilter1拦截了...");// filter默认都是拦截的 如果想不拦截资源了,要手动放行// 核心放行方法filterChain.doFilter(servletRequest,servletResponse);}/** 执行时机:服务器关闭执行* 执行次数:1次* 执行者:tomcat** */@Override // filter的销毁方法public void destroy() {System.out.println("我凉凉了...666666666");}}

//过滤器:public class FeifaFilter implements Filter{private List<String> list=new ArrayList();@Override // 服务器启动就执行一次public void init(FilterConfig filterConfig) throws ServletException {try {// 2 当要判断的时候,需要加载该文档,读取内容String realPath = filterConfig.getServletContext().getRealPath("feifa.txt");File file = new File(realPath);InputStreamReader is = new InputStreamReader(new FileInputStream(file),"utf-8");BufferedReader br=new BufferedReader(is);// 3 将读取的非法字符放入一个容器中(list)String line=null;while ((line=br.readLine())!=null){// 放入集合中list.add(line);}System.out.println(list);}catch (Exception e){e.printStackTrace();}}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 1 获取用户发表的言论String info = servletRequest.getParameter("info");// 2 判断该言论是否合法//1 数据库中哟一个非法字符表// 2 非法字符的收集文档.txt// 1 创建一个非法字符的文档,收集非法字符// 4 将用户的输入内容和容器中的内容做对比 如果非法:写响应 不非法:放行if(info!=null&&list.contains(info)){// 3 不合法--写响应信息servletResponse.getWriter().print("你发表的言论不和谐,请重新输入...");return;}// 4 合法--放行filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}}

总结filter

filter概述:本质上是一个类,实现了filter接口规范fitler作用:可以对浏览器访问服务器的请求进行拦截filter的快速入门:xml方式 注解方式xml方式:1 创建1个类型实现filter接口 2 在web.xml中进行拦截资源的配置注解方式:直接在当前的filter类上添加注解 @webFilter(url-pattern="路径")filter细节1 filter不是对所有资源都拦截,需要拦截哪个要创建且配置2 多个filter拦截了同一个资源,多个filter都执行3 filter放行之后,会找下一个filter执行,直到没有filter了才会去找资源filter的生命周期服务器一启动就会创建当前的filter对象执行init方法当访问到要匹配的资源时,filter的dofilter核心拦截方法执行 访问一次执行那一次当服务器关闭的时候,filter的destory销毁方法执行filter拦截方式filter默认只对浏览器的请求进行拦截 不对服务器的内部跳转请求进行拦截如果想配置可以在web.xml中进行配置<filter-mapping><filter-name>MyFilter2</filter-name><url-pattern>/*</url-pattern><!--让当前filter拦截内部的请求转发--><dispatcher>FORWARD</dispatcher><!--让当前filter拦截浏览器过来的请求--><dispatcher>REQUEST</dispatcher></filter-mapping>filter路径配置方式:三种(面试题)1 完全路径匹配 例如:/sd1 /sd2 针对单一资源的 但是<url-pattern>可以写多分2 目录匹配 例如: /* /a/b/* 针对指定目录下的所有资源的3 扩展名匹配 例如: *.jsp *.html 针对一种类型的所有资源的

案例一:统一解决所有servlet的乱码问题

案例二:非法字符的过滤

页面

拦截器拦截

package cn.itcast.filter;import javax.servlet.*;import java.io.*;import java.util.ArrayList;import java.util.List;//过滤器:public class FeifaFilter implements Filter{private List<String> list=new ArrayList();@Override // 服务器启动就执行一次public void init(FilterConfig filterConfig) throws ServletException {try {// 2 当要判断的时候,需要加载该文档,读取内容String realPath = filterConfig.getServletContext().getRealPath("feifa.txt");File file = new File(realPath);InputStreamReader is = new InputStreamReader(new FileInputStream(file),"utf-8");BufferedReader br=new BufferedReader(is);// 3 将读取的非法字符放入一个容器中(list)String line=null;kwhile ((line=br.readLine())!=null){// 放入集合中list.add(line);}System.out.println(list);}catch (Exception e){e.printStackTrace();}}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 1 获取用户发表的言论String info = servletRequest.getParameter("info");// 2 判断该言论是否合法//1 数据库中哟一个非法字符表// 2 非法字符的收集文档.txt// 1 创建一个非法字符的文档,收集非法字符// 4 将用户的输入内容和容器中的内容做对比 如果非法:写响应 不非法:放行if(info!=null&&list.contains(info)){// 3 不合法--写响应信息servletResponse.getWriter().print("你发表的言论不和谐,请重新输入...");return;}// 4 合法--放行filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}}

listener–监听器

概述

listener:本质上是一个类,需要实现监听器的接口

作用

监听器可以去监听到域对象的状态变化(ServletContext request session)

状态变化:创建和销毁

提供的监听器:

ServletContextListener: 监听ServletContext创建和销毁(掌握)

ServletRequestListener: 监听request 创建和销毁

HttpSessionListener: 监听session创建和销毁

listener的使用

java提供了各种各样的监听器,每个监听器都有自己的作用

1.ServletContextListener监听器:监听ServletContext对象的创建和销毁的(掌握)

listener监听器的创建

xml方式:(掌握)1 创建一个java类,实现java提供的指定监听器的接口2 在web.xml中进行配置注解方式: 在编写的listener类上加上注解 @WebListener

// 成为一个能监听到ServletContext对象的创建和销毁的监听器//@WebListenerpublic class Mylistener1 implements ServletContextListener{@Override //监听创建 ServletContext对象已创建此方法触发public void contextInitialized(ServletContextEvent servletContextEvent) {//System.out.println("ServletContext对象创建了...");System.out.println("服务器一启动就去加载框架的一些配置信息..");}@Override // 监听销毁 ServletContext对象已销毁此方法触发public void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("ServletContext对象销毁了...");}}

xml方式:

注解方式:

扩展一: 用监听器监听request的创建和销毁:

因此,请求一次,创建一个request对象,响应回去,request对象销毁。

用监听器监听request的创建和销毁:

在一个新的会话中,第一次访问到request.getSession()中,创建session对象,几个servlet共用的是一个session对象,会话关闭,重新访问,又是新的session对象。

扩展二: 服务器端servlet的路径问题:

相对路径(不建议用),绝对路径

<%--Created by IntelliJ IDEA.User: muzimooDate: -5-9Time: 18:19To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>访问servlet</title></head><body><a href="/day07/sd1">访问sd1</a><br/><a href="../../../sd1">访问sd1</a><br/><%--服务器端Servlet的路径问题:绝对路径 相对路径绝对路径:当前浏览器访问servlet的路径 http://localhost:8080/day07/sd1简写: 以/项目名开始的 /day07/sd1相对路径:以./开始 ./sd1==sd1相对比较的是地址栏路径demo.jsp: http://localhost:8080/day07/demo.jspsd1: http://localhost:8080/day07/sd1demo.jsp: http://localhost:8080/day07/html/demo.jspsd1: http://localhost:8080/day07/sd1../:代表到上一层路径demo.jsp: http://localhost:8080/day07/html/1/2/demojspsd1:http://localhost:8080/day07/sd1../../../sd1--%></body></html>

扩展三: 将servlet的创建时机提前到服务器开启

servlet的生命周期 默认情况下是,当浏览器访问servlet时,创建该servlet对象,执行init方法,且执行一次。

也可以在服务器启动时,创建servlet对象。

扩展四:获取当前项目名路径

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。