JavaWeb-过滤器_思维导图
JavaWeb核心思维导图
三大作用
获取初始化参数int-param 获取ServletContext对象
注意点
重写init方法里面一定要调用父类的init(ServletConfig)操作
ServletContxex
概念 作用
ServletContext是一个接口,他表示Servlet上下文对象
一个web工程,只有一个ServletContext对象实例
通过继承HttpServlet实现Servlet程序
编写一个类去继承HttpServlet类 根据业务需要重写doGet或doPost方法
到web.xml配置Servlet程序的访问地址
Servlet的继承体系
ServletConfig
ServletConfig类从类名上来看,就知道是Servlet程序的配置信息类
script标签引入js文件
img标签引入图片
哪些是GET请求,哪些是POST请求
iframe引入html页面
在浏览器地址栏中输入地址后敲回车
POST请求有哪些
form标签 method=post
GET和POST请求区别
get post
数据不安全
get的数据主要以字符串为主
如果需要向服务器发图片或其它二进制文件get就不是很方便了
域对象,是可以像Map一样存取数据的对象,叫域对象
这里的域指的是存取数据的操作范围,整个web工程
ServletContext对象是一个域对象
存数据
setAttribute()
取数据
getAttribute()
删数据
removeAttribute()
ServletContext是在web工程部署启动的时候创建的,在web工程停止的时候销 毁
JavaWeb中filter的详解及应用案例
JavaWeb中filter的详解及应⽤案例⼀:Filter介绍 Filter可认为是Servlet的⼀种“变种”,它主要⽤于对⽤户请求(HttpServletRequest)进⾏预处理,也可以对服务器响应(HttpServletResponse)进⾏后处理,是个典型的处理链。
它与Servlet的区别在于:它不能直接向⽤户⽣成响应。
完整的流程是:Filter对⽤户请求进⾏预处理,接着将请求交给Servlet进⾏处理并⽣成响应,最后Filter再对服务器响应进⾏后处理。
⼆:Filter的⼏个⽤处 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
三:Filter的种类 ⽤户授权的Filter:Filter负责检查⽤户请求,根据请求过滤⽤户⾮法请求。
⽇志Filter:详细记录某些特殊的⽤户请求。
负责解码的Filter:包括对⾮标准编码的请求解码。
Filter可拦截多个请求或响应;⼀个请求或响应也可被多个请求拦截。
四:Filter的应⽤实例 创建⼀个Filter只需要两个步骤:1.创建Filter处理类(如:MyFiletr)实现javax.servlet.Filter接⼝;2.web.xml中配置Filter 4.1.简单的记录⽇志的Filter,这个Filter负责拦截所符合条件的⽤户请求,并将请求的信息记录在⽇志中。
web.xml配置信息: 总结:上⾯的程序实现了doFilter()⽅法,实现该⽅法就可以实现对⽤户请求进⾏预处理,也可以实现对服务器响应进⾏后处理--他们的分界线为是否调⽤了chain.doFilter(),执⾏该⽅法之前,即对⽤户请求进⾏预处理;执⾏该⽅法之后,即对服务器响应进⾏后处理。
JavaWeb过滤器详解
JavaWeb过滤器详解过滤器是什么玩意?所谓过滤器,其实就是⼀个服务端组件,⽤来截取⽤户端的请求与响应信息。
过滤器的应⽤场景:1.对⽤户请求进⾏统⼀认证,保证不会出现⽤户账户安全性问题2.编码转换,可在服务端的过滤器中设置统⼀的编码格式,避免出现乱码3.对⽤户发送的数据进⾏过滤替换4.转换图像格式5.对响应的内容进⾏压缩其中,第1,2场景经常涉及。
login.jsp<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'login.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form action="<%=path %>/servlet/LoginServlet" method="post" >⽤户名:<input type="text" name="username" />密码:<input type="password" name="password" /><input type="submit" value="登录" /></form></body></html>success.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> <%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body></body></html>failure.jsp<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'login.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>登录失败,请检查⽤户名或密码!</body></html>LoginFilter.javapackage com.cityhuntshou.filter;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;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginFilter implements Filter {private FilterConfig config;public void destroy() {}public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) arg0;HttpServletResponse response = (HttpServletResponse) arg1;HttpSession session = request.getSession();//过滤器实际应⽤场景之⼆-----编码转换String charset = config.getInitParameter("charset");if(charset == null){charset = "UTF-8";request.setCharacterEncoding(charset);String noLoginPaths = config.getInitParameter("noLoginPaths");if(noLoginPaths != null){String[] strArray = noLoginPaths.split(";");for(int i = 0; i < strArray.length; i++){//空元素,放⾏if(strArray[i] == null || "".equals(strArray[i]))continue;if(request.getRequestURI().indexOf(strArray[i]) != -1){arg2.doFilter(arg0, arg1);return;}}}if(request.getRequestURI().indexOf("login.jsp") != -1|| request.getRequestURI().indexOf("LoginServlet") != -1){arg2.doFilter(arg0, arg1);return;}if(session.getAttribute("username") != null){arg2.doFilter(arg0, arg1);}else{response.sendRedirect("login.jsp");}}public void init(FilterConfig arg0) throws ServletException {config = arg0;}}LoginServlet.javapackage com.cityhuntshou.servlet;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;import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet {/*** Constructor of the object.*/public LoginServlet() {super();}/*** Destruction of the servlet. <br>*/public void destroy() {super.destroy(); // Just puts "destroy" string in log// Put your code here}/*** 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*/}/*** The doPost method of the servlet. <br>** This method is called when a form has its tag value method equals to post.** @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 doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");//new String(username.getBytes("ISO-8859-1"),"UTF-8")System.out.println(username);if("admin".equals(username) && "admin".equals(password)){//校验通过HttpSession session = request.getSession();session.setAttribute("username", username);response.sendRedirect(request.getContextPath()+"/success.jsp");}else{//校验失败response.sendRedirect(request.getContextPath()+"/failure.jsp");}}/*** Initialization of the servlet. <br>** @throws ServletException if an error occurs*/public void init() throws ServletException {// Put your code here}}web.xml<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><display-name></display-name><servlet><description>This is the description of my J2EE component</description><display-name>This is the display name of my J2EE component</display-name> <servlet-name>LoginServlet</servlet-name><servlet-class>com.cityhuntshou.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/servlet/LoginServlet</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><filter><filter-name>LoginFilter</filter-name><filter-class>com.cityhuntshou.filter.LoginFilter</filter-class><init-param><param-name>noLoginPaths</param-name><param-value>login.jsp;failure.jsp;loginServlet</param-value></init-param><init-param><param-name>charset</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>LoginFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>访问结果:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
第17章 过滤器和监听器
过滤器的配置
过滤器的配置有以下几个步骤:
用<filter-mapping>配置过滤器的映射 过滤所有文件
<filter-mapping> <filter-name>FilterName</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Jsp程序设计
第01章 JAVA WEB入门
过滤器
【例】定义三个过滤器: 如果用户访问"/test"下的资源时,过滤器1被激活,它判断用户 是否已经登录,如果没有登录则中断请求,并返回404错误 信息,如果已经登录则将请求转发给下一个过滤器。 定义过滤器2,当请求"/*"资源并且请求是来自客户端时它才被 激活,显示提示信息,然后把请求转发给下一个过滤器。 过滤器3的功能同过滤器2,但它的请求类型为REQUEST或 FORWARD。
Jsp程序设计 第01章 JAVA WEB入门
过滤器
(2)编译Filter1程序,成功后,把Filter1.class文件放至 c:\tomcat\webapps\ROOT\WEB-INF\classes文件夹下。 (3) 新建一个类"Filter2",输入如下的代码: package my; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Filter2 implements Filter{ private FilterConfig config=null; public void init(FilterConfig config) throws ServletException{ this.config=config; }
Java程序设计(基础)思维导图-简单高清脑图_知犀思维导图思维导图-简单高清脑图_知犀
Java程序设计(基础)概述特点面向对象平台可移植性分布式多线程安全性工作方式开发工具JDKjavacjava javadocIDElntelliJEclipse NetBeans术语JDK JREJVM API源程序结构package管理类解决命名冲突import class 注释行注释//块注释/*…*/文档注释/**…*/@author @param@return @throws基本语法关键字有特殊含义的单词(50)能用的(48)不能用的(2)gotoconst 标识符给类、接囗、方法、变量等起的名字命名规则字母、数字、下划线和$,数字不能开头大小写敏感不能跟关键字和保留字(null、true、false)冲突见名知意驼峰标识类名每个单词首字母大写变量和方法名从第二个单词开始每个单词首字母大写命名常量全大写,多个单词用下划线隔开运算符分类算术运算符赋值运算符关系运算符短路运算符条件运算符(三目运算符)自增/自减运算符正负号运算符移位运算符布尔运算符位运算符new 创建对象instanceof运行时类型识别()强制类型转换改变运算优先级[]下标运算符.取成员运算符优先级搞不清楚优先级直接加()结合性从左向右从右向左赋值运算自加自减条件运算正负号字面量整型字面量:100、100L浮点型字面量:3.5、3.5F、3.123e2字符字面量:'a'、'\t'、'\123'布尔型字面量:true、false引用字面量:null类型字面量:String.class、int.class分隔符数据类型基本类型整叙byteshortintlong小数floatdoublecharboolean 枚举类型enum引用类型String数组自定义的类或接囗面向对象基本概念类对象的蓝图和模板类与类之间的关系IS-A:继承泛化实现HAS-A:关联关联聚合合成USE-A:依赖定义类[访问修饰符] [修饰符] class类名 [extends 父类] [implements 接囗1,接口2,...] {}属性:数据抽象方法:行为抽象构造器创建对象:new构造器()对象一切皆为对象对象都有属性和行为对象都是唯一的对象都属于某个类消息调用对象的方法就是给对象发送了一个消息一个对象能够接受某种消息,就意味着该对象向外界提供了某种服务三大支柱封装隐藏一切可隐藏的实现细节,只暴露最简单的编程接囗继承从已有类创建新类的过程提供继承信息的类叫父类(基类、超类)得到继承信息的类叫子类(派生类)子类可以继承到父类中public、protected的属性和方法Java中的继承是单继承Object类是所有类的父类多态定义解释1:同样的引用调用同样的方法却做了不同的事情解释2:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但对A系统来说是透明的实现方法重写:不同的子类对父类的同一方法给出不同的实现版本对象造型:用父类型的引用引用子类型的对象相关内容访问修饰符类public默认方法、属性、内部类public protected默认private抽象类如果一个类有抽象方法,这个类必须被声明为抽象类抽象类中可以没有抽象方法,抽象类也可以有自己的构造器抽象类不能实例化(不能创建对象)强烈建议:将被继承的类设计成抽象类接囗接囗是约定:实现接囗的类必须重写接口中所有方法,否则就要声明为抽象类接囗代表能力:实现了接囗的类就具备了接囗所描述的能力接囗是一种角色:一个类可以实现多个接囗,一个接囗也可以被多个类实现Java中的接囗单方法接囗:这个唯一的方法通常都是回调方法ActionListener Runnable Comparable标识接囗:没有方法,但是表示了某种能力CloneableSerializable常量接囗:这是接囗最不正确的用法内部类相当于外部类中的一个属性内部类可以访问外部类的私有成员设计原则单一职责原则专业化模块化开闭原则抽象是关键封装可变性依赖倒转原则里氏替换原则接囗隔离原则合成聚合复用原则迪米特法则字符串String创建字符串对象String s="Hello";s引用静态区的字符串字面量String s=new String(Hello")s引用堆上的字符串对象字符串的方法长度:length()取字符:charAt(int)变大/小写:toUpperCase()/toLowerCase()连接:concat(String)比较:equals(String)/compareTo(String)判断开头/结尾:startsWith(String)/endsWith(String)模式匹配:indexOf(String,[int])/lastlndexOf(String,[int]取子串:substring(int,[int])修剪左右两边空白:trim()替换:replace(String,String)/replaceAII(String,String拆分:split(String)String代表的是不变字符串可以被修改的字符串StringBuilder 适用于单线程环境StringBuffer适用于多个线程操作同一个字符串的场景方法在指定位置插入字符串:insert(int,String)删除指定位置的字符:delete(int,int)倒转:reverse()追加:append(String)方法[访问修饰符] [修饰符]返回类型方法名([参数列表])[异常声明]访问修饰符public protected默认private修饰符static abstractfinal修饰变量,变量变成常量修饰类,类不能被继承修饰方法,方法不能被重写synchronizednative方法调用静态方法:类名.方法名(实参列表)非静态方法:对象.方法名(实参列表)递归数组基本用法数组的定义数组的初始化new静态初始化length属性下标运算Arrays工具类sort:排序toString:将数组变成字符串copyOf:数组拷贝equals:比较数组元素是否相同二维数组一个普通数组,每个元素又是一个数组应用表格矩阵2D游戏中的地图棋盘流程控制循环结构分类while循环do…while循环for循环for-each循环相关关键字breakcontinue分支结构if...elseswitch...case...default顺序结构。
java思维导图笔记
Java思维导图笔记1. 什么是思维导图思维导图是一种用于展示思维和概念之间关系的图形工具。
它能够帮助我们整理、组织和表达思维。
在学习和思考过程中,使用思维导图可以更清晰地将复杂的信息归类和记录,提高信息的理解和记忆。
2. Java基本语法2.1 数据类型Java提供了一系列的数据类型,包括基本数据类型(如整数、浮点数、字符、布尔值)和引用数据类型(如类、接口、数组等)。
常见的基本数据类型有: - 整数类型:byte、short、int、long- 浮点数类型:float、double - 字符类型:char - 布尔类型:boolean引用数据类型: - 类(class):是面向对象编程中的基本概念,用来封装数据和方法。
- 接口(interface):是一种抽象的数据类型,用来定义类的行为规范。
- 数组(array):用来存储一组相同类型的元素。
2.2 控制流程语句控制流程语句用于控制程序的执行流程。
Java提供了三种主要的控制流程语句:顺序结构、选择结构和循环结构。
顺序结构是最简单的控制流程,指按照代码的先后顺序执行。
选择结构用于根据条件选择不同的执行路径。
常见的选择语句有:- if语句:用于根据一个条件判断选择是否执行某个代码块。
- switch语句:用于根据一个表达式的值选择执行不同的代码块。
循环结构用于重复执行某个代码块直到满足退出条件。
常见的循环语句有: - while语句:在循环开始之前,先判断条件是否满足,如果满足则执行循环体,然后再次判断条件。
- do-while语句:先执行一次循环体,然后再判断条件是否满足,如果满足则继续执行循环体。
- for语句:在循环开始之前,先执行初始化表达式,然后判断条件是否满足,如果满足则执行循环体,并在每次循环结束后执行更新表达式。
2.3 方法方法是一种可重复使用的代码块,用于执行特定的任务。
在Java 中,每个方法都有名称和参数列表,有时也有返回值。
JavaWeb开发知识体系图
JavaWeb开发知识体系图⼀:1. Java 核⼼知识 J2SE是J2EE的技术基础,所以熟练掌握J2SE的内容⾮常重要。
本阶段讲解了Java的核⼼语法及基本使⽤。
⼆:2. JSP JSP、PHP、 三门技术被称为 Web 后端开发的 3P 技术,其中 JSP 依托 J2EE 平台更是 Web 开发领域的⼀枝独秀。
学好JSP,是进⼊ J2EE 企业开发的第⼀步。
通过本阶段内容的学习,你将能够搭建 JSP 的开发环境,了解 JSP 的基本语法及内部对象的使⽤。
1.jsp的语⾔特点:jsp是⼀种脚本语⾔,jsp拥有java语⾔的所有特性jsp运⾏于jsp容器中jsp会被转换成Servlet2.jsp的基本语法jsp程序段:其中定义的变量是局部变量<%String hello = "hello word";out.print(hello);%>jsp程序段:其中定义的变量,函数,类是全局的,定义完后可以在页⾯的其他地⽅使⽤<%!String hello = "hehe";%>jsp表达式:可以把表达式的值做为字符串直接输出<%="表达式"%>注释:<%--jsp注释 --%> 不会被传到浏览器<!-- html注释 --> 会被传到浏览器,但还是注释3.jsp的编译指令和动作指令编译指令和动作指令的区别:编译指令只在jsp转化成servlet中起作⽤,⽽动作指令是客户端在请求时动态被执⾏的(客户端每次请求时都有可能被执⾏)(1)page编译指令⼀般位于页⾯的最上⽅,⼀个页⾯可以有多个page编译指令①⽤于指定jsp程序所使⽤的脚本语⾔的程序②设置⽹页的属性和编码③⽤于设置jsp程序本⾝的编码import属性⽤于导⼊java类,有两种⽅式①②errorPage属性的使⽤第⼀步先模拟⼀个异常的jsp,并指定发⽣异常后跳转的jsp页⾯①使⽤errorPage指定发⽣异常后跳转的页⾯②在body体内伪造⼀个异常第⼆步在handler_error.jsp使⽤isErrorPage="true",并处理异常如果不指定errorPager属性的情况下会直接报异常(2)include编译指令include是jsp的静态编译指令,可以将⼀个web⽂件(html⽂件或者jsp⽂件)包含到当前的jsp⽂件中(3)forward动作指令:重定向指令<jsp:forward page="login.jsp"></jsp:forward>forward指令后⾯的代码不会被执⾏也不会被输出到客户端forward跳转到新的界⾯的时候携带参数的⽅法<jsp:forward page="login.jsp"><jsp:param value="lupeng" name="username" /><jsp:param value="123" name="password" /></jsp:forward>在login的界⾯获取参数String userName = request.getParameter("username");String password = request.getParameter("password");(4)include动作指令① include进来head标签②include进来body标签,并传递参数下⾯的是body.jsp⽂件(4)useBean动作指令表单提交数据表单界⾯不适⽤useBean的情况,获取数据如果使⽤userBean必须先new⼀个javaBean,与上传的数据类型对应,获取的⽅法如下使⽤useBean传数据的时候,表单界⾯中name的值必须与JavaBean中属性名⼀直,否则传不过来4.jsp内置对象① out对象⽤于向客户端、浏览器输出数据② request对象封装了来⾃客户端、浏览器的各种信息request.getMethod();获取请求的⽅法名request.getRequestURI();获取请求资源request.getProtocol();获取请求使⽤的协议request.getServerName();获取请求的服务器IPrequest.getServerPort();获取请求的服务器端⼝request.getRemoteAddr();获取客户端的IP地址request.getRemoteHost();获取客户端的主机名request.getParameter("");获取表单提交的值getParameter("");⽅法⽤于获取客户端、浏览器提交的表单数据,⽽request.setAttribute("", "");和request.getAttribute("");⽤于在web组件之间共享数据③ response对象封装了服务器的响应信息response.setHeader(arg0, arg1)设置请求头response.setIntHeader("refresh", 2);设置每隔两秒请求⼀次response.sendRedirect(url);实现页⾯跳转使⽤response设置CookieCookie myCookie = new Cookie("d", "d");myCookie.setMaxAge(3600);response.addCookie(myCookie);④ exception对象封装了jsp执⾏过程中发⽣的异常和错误信息⑤ config对象封装了应⽤程序的配置信息⑥ page对象指向了当前jsp程序本⾝⑦ session对象⽤来保存会话信息,也就是说它可以在统⼀⽤户的不同请求之间共享数据session.getId(); session的唯⼀标识符session.getCreationTime(); 获取session创建的时间session.getLastAccessedTime(); 获取session最后⼀次访问的时间session.getMaxInactiveInterval();获取session的失效时间可以在WEB-INF中的web.xml中⼿动设置session的失效时间(以分钟为单位)<session-config><session-timeout>10</session-timeout></session-config>⑧application对象代表当前应⽤的上下⽂,它可以在不同的⽤户之间共享信息⑨ pageContext对象提供了对jsp页⾯所有对象以及命名空间的访问三:3. JDBCJDBC 是 Java 对关系型数据库进⾏访问的最主要的 API,是 Java 数据库编程的技术基础。
javaweb——Filter(过滤器)学习
javaweb——Filter(过滤器)学习一、Filter简介Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter 技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态html 文件等进行拦截,从而实现一些特殊的功能。
例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。
通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:二、Filter是如何实现拦截的?Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter 方法,因此,在该方法内编写代码可达到如下目的:调用目标资源之前,让一段代码执行。
是否调用目标资源(即是否让用户访问web资源)。
调用目标资源之后,让一段代码执行。
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web 资源就会被访问,否则web资源不会被访问。
三、Filter开发入门3.1、Filter开发步骤Filter开发分为二个步骤:编写java类实现Filter接口,并实现其doFilter方法。
在web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。
java web程序设计思维导图,脑图
java web程序设计Servlet概述Servlet基本知识Servlet是Java EE架构中的关键组成第一个Servlet1.编码:创建一个类,继承Http Servlet重写do Get(),do Post()方法2.配置:在web,xml中配置该Servlet的访问路径Servlet的生命周期init():用于Servlet初始化。
当容器创建Servlet实例后,会自动调用此方法。
service():用于服务处理。
当客户端发出请求,容器会自动调用此方法进行处理,并将处理结果响应到客户端。
destroy():用于销毁Servlet。
当容器销毁Servlet实例时自动调用此方法,释放Servlet实例,清除当前Servlet所持有的资源。
Servlet生命周期阶段 1.装载Servlet 2.创建Servlet实 3.初始化 4.服务 5.销毁Servlet数据处理1.读取表单数据2.处理HTTP请求报头3.设置HTTP响应报头Servlet会话跟踪会话跟踪包括哪几种Cookie技术Session技术URL重写技术隐藏表单域技术CookieCookie的安全机制1.Cookie不会以任何方式在客户端被执行2.浏览器会限制来自同一个网站的Cookie数目3.单个Cookie的长度是有限制的4.浏览器限制了最多可以接受的Cookie数目作用获取请求携带的cookie。
语法${cookie.cookie的name}SessionSession的定义Session是在Java Servlet API中引入的一个非常重要的机制,用于跟踪客户端的状态,即在一段时间内,单个客户端与Web服务器之间的一连串的交互过程称为一个会话。
Session的使用setAttribute()方法:用于在Session对象中保存数据,数据以Key/Value映射形式存放getAttribute()方法:从Session中提取知道Key对应的Value值创建HttpSession对象有以下两种方式getSession():返回当前请求的会话,如果该会话对象不存在则创建一个新会话。
java web filter过滤器链工作原理
一、引言在Java的Web开发中,过滤器(Filter)是一种十分重要的组件,它可以拦截用户请求并在请求到达Servlet之前或者Servlet响应返回给客户端之前进行一些处理。
而过滤器链(Filter chain)则是由多个过滤器按照一定的顺序组成,它们共同为请求和响应提供处理和转换。
本文将深入探讨Java Web过滤器链的工作原理,包括过滤器链的执行顺序、过滤器链中的过滤器如何协作以及一些常见的应用场景。
二、过滤器链的执行顺序1. 过滤器链中的过滤器是按照在web.xml文件中的配置顺序依次执行的。
在web.xml文件中,每个过滤器都有一个<filter>标签来定义,而<filter>标签的顺序就是过滤器执行的顺序。
2. 过滤器的执行顺序并不是固定的,可以通过修改web.xml文件中<filter-mapping>标签的顺序来改变过滤器的执行顺序。
一般情况下,过滤器链的执行顺序是按照web.xml文件中<filter-mapping>标签的顺序执行的。
3. 过滤器链的最后一个过滤器是请求的目标资源(Servlet或JSP),而请求的目标资源执行完毕后,过滤器链会按照相反的顺序执行,即按照web.xml文件中<filter-mapping>标签的相反顺序执行。
三、过滤器链中的过滤器如何协作1. 过滤器链中的过滤器通过FilterChain对象进行协作。
在过滤器的doFilter()方法中,可以调用FilterChain对象的doFilter()方法将请求传递给下一个过滤器或者目标资源,同时也可以在doFilter()方法中对请求和响应进行一些处理。
2. 过滤器链是一个有序的链表结构,每个过滤器都可以在处理完自己的逻辑之后选择将请求传递给下一个过滤器或者目标资源,也可以选择在自己的逻辑中结束请求的处理并将响应返回给客户端。
3. 过滤器链中的过滤器可以共享同一个HttpServletRequest和HttpServletResponse对象,因此可以进行一些共享数据和状态的操作。
Java工程师学习之路思维导图
Java⼯程师学习之路思维导图前⾯看Hollis的微信公众号更新了Java⼯程师成神之路的⽂档,感觉⾥⾯的内容清晰、齐全,可以⽤来审视⾃⼰,也能够知道⾃⼰在那些⽅⾯可以继续前⾏,想着有时间分享出来。
⼀、基础篇JVMJVM内存结构堆、栈、⽅法区、直接内存、堆和栈区别Ja va内存模型内存可见性、重排序、顺序⼀致性、volatile、锁、final垃圾回收内存分配策略、垃圾收集器(G1)、GC算法、GC参数、对象存活的判定JVM参数及调优Ja va对象模型oop-klass、对象头H o tSpo t即时编译器、编译优化类加载机制classLoader、类加载过程、双亲委派(破坏双亲委派)、模块化(jboss modules、osgi、jigsaw)虚拟机性能监控与故障处理⼯具jps, jstack, jmap、jstat, jconsole, jinfo, jhat, javap, btrace、TProfiler编译与反编译javac 、javap 、jad 、CRFJava基础知识阅读源代码String、Integer、Long、Enum、BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、ArrayList & LinkedList、 HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSetJa va中各种变量类型熟悉Ja va Str ing的使⽤,熟悉String的各种函数JDK 6和JDK 7中substring的原理及区别、replaceFirst、replaceAll、replace区别、String对“+”的重载、String.valueOf和Integer.toString的区别、字符串的不可变性⾃动拆装箱Integer的缓存机制熟悉Ja va中各种关键字transient、instanceof、volatile、synchronized、final、static、const 原理及⽤法。
详解JavaWeb中的过滤器Filter
详解JavaWeb中的过滤器Filter ⽬录⼀、什么是过滤器1.1使⽤步骤⼆、初体验2.1mynav.html2.2FilterServlet程序2.3HelloServlet程序2.4web.xml2.5index.jsp三、测试四、Filter的⽣命周期五、FilterConfig类六、FilterChain过滤器链七、Filter的拦截路径⼋、精确匹配8.1⽬录匹配8.2后缀名匹配⼀、什么是过滤器1.Filter过滤器的作⽤:拦截请求2.拦截请求常见场景:(1)权限检查(2)⽇记操作(3)事务管理1.1 使⽤步骤Filter 过滤器的使⽤步骤:1、编写⼀个类去实现Filter 接⼝2、实现过滤⽅法doFilter()3、到web.xml 中去配置Filter 的拦截路径⼆、初体验web⼯程下新建⼀个admin⽬录,作为需要权限才能访问的⽬录,其中有两个⽂件2.1 mynav.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>导航</title></head><body><table><tr><td>百度<input type="text"></td></tr><tr><td>Google<input type="text"></td></tr><tr><td>必应<input type="text"></td></tr></table></body></html>2.2 FilterServlet程序package com.filter.filter;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.io.IOException;/*** @author ningqian* @create -05-16 20:17*///注意导包是javaxpublic class FilterServlet implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("来到Filter过滤器");HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;HttpSession session = httpServletRequest.getSession();//如果session的属性user为空,转发到⾸页if(session.getAttribute("user")==null){servletRequest.getRequestDispatcher("/index.jsp").forward(servletRequest,servletResponse);}else{//如果session的属性user不为空,则放⾏filterChain.doFilter(servletRequest,servletResponse);}}@Overridepublic void destroy() {}}2.3 HelloServlet程序package com.filter.filter;import java.io.*;import javax.servlet.http.*;import javax.servlet.annotation.*;@WebServlet(name = "helloServlet", value = "/hello-servlet")public class HelloServlet extends HttpServlet {private String message;public void init() {message = "Hello World!";}public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html");// HelloPrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1>" + message + "</h1>");out.println("</body></html>");HttpSession session = request.getSession();session.setAttribute("user","ningqian");}public void destroy() {}}2.4 web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>FilterServlet</filter-name><filter-class>com.filter.filter.FilterServlet</filter-class></filter><filter-mapping><filter-name>FilterServlet</filter-name><!--表⽰受限的⽂件--><url-pattern>/admin/*</url-pattern></filter-mapping><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.filter.filter.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>2.5 index.jsp<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>FilterServlet</filter-name><filter-class>com.filter.filter.FilterServlet</filter-class></filter><filter-mapping><filter-name>FilterServlet</filter-name><!--表⽰受限的⽂件--><url-pattern>/admin/*</url-pattern></filter-mapping><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.filter.filter.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>三、测试1.启动服务器2.在浏览器地址栏输⼊:http:localhost:8080/filter/admin/1.jpg表⽰直接访问admin⽬录下的图⽚由于此⽬录下的⽂件在web.xml中配置为受限,所以此时请求被FilterServlet收到,使⽤doFilter⽅法进⾏请求过滤检查,发现会话session中没有user属性,所以将该请求转发到index.jsp3.在浏览器地址栏输⼊:http:localhost:8080/filter/⾸页不在受限的⽬录下,所以可以直接访问,点击页⾯上的链接Hello Servlet,此时,将请求发到服务器,HelloServlet程序接收,通过doGet()⽅法,给会话session的user赋值4.再次在浏览器输⼊:http:localhost:8080/filter/admin/1.jpg,此时就可以正常访问。
JavaWeb学习笔记九过滤器、注解
JavaWeb学习笔记九过滤器、注解过滤器Filterfilter是对客户端访问资源的过滤,符合条件放⾏,不符合条件不放⾏,并且可以对⽬标资源访问前后进⾏逻辑处理。
步骤:1. 编写⼀个过滤器的类实现Filter接⼝2. 实现接⼝中尚未实现的⽅法(着重实现doFilter⽅法)3. 在web.xml中进⾏配置(主要是配置要对哪些资源进⾏过滤)例⼦,过滤器实现类:package com.yyb.filter;import java.io.IOException;import javax.servlet.*;/*** Created by Administrator on 2017/7/28.*/public class FilterDemo implements Filter {@Override//Filter创建的时候执⾏init⽅法public void init(FilterConfig filterConfig) throws ServletException {//1、获得web.xml中filter 的名称<filter-name>FilterDemo</filter-name>System.out.println(filterConfig.getFilterName());//2、获得当前filter的初始化参数System.out.println(filterConfig.getInitParameter("aaa"));//3、获得servletContextfilterConfig.getServletContext();System.out.println("init ....");}@Override//doFilter是Filter的核⼼过滤的⽅法/** request: 内部封装是客户端http请求的内容* response: 代表是响应* FilterChain: 过滤器链对象*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("quick1 running....");//放⾏请求chain.doFilter(request, response);}@Override//Filter对象销毁的时候执⾏destory⽅法public void destroy() {System.out.println("destroy...");}}web.xml<filter><filter-name>FilterDemo</filter-name><filter-class>com.yyb.filter.FilterDemo</filter-class></filter><filter-mapping><filter-name>FilterDemo</filter-name><url-pattern>/*</url-pattern></filter-mapping>Filter的API详解filter⽣命周期及其与⽣命周期相关的⽅法,Filter接⼝有三个⽅法,并且这个三个都是与Filter的⽣命相关的⽅法:init(Filterconfig):代表filter对象初始化⽅法,filter对象创建时执⾏。