Servlet日志
- 格式:doc
- 大小:159.50 KB
- 文档页数:7
servlet过滤器工作原理
Servlet过滤器是Java Web应用程序中的一个组件,主要用于在请求到达Servlet之前或响应离开Servlet之前对请求或响应进行预
处理和后处理。
其工作原理可以分为以下几个步骤:
1. 过滤器包含了一个或多个过滤器链,每个过滤器链由多个过
滤器组成。
当一个请求到达Servlet容器时,容器会首先检查是否有
过滤器链与其对应。
2. 如果存在对应的过滤器链,则依次对请求进行预处理,如对
请求参数进行验证、对请求进行日志记录等操作。
3. 然后,过滤器链将处理后的请求传递给被过滤的Servlet,Servlet对请求进行处理并产生响应。
4. 当Servlet容器收到响应并准备发送到客户端时,它会遍历
响应所经过的过滤器链,依次对响应进行后处理,如对响应进行压缩、对响应进行加密等操作。
5. 最后,Servlet容器将处理后的响应发送到客户端。
总的来说,Servlet过滤器的作用是增强Java Web应用程序的安全性、可靠性和性能。
通过对请求和响应进行预处理和后处理,可以
有效地防范潜在的安全威胁,优化应用的性能,提高用户体验。
Tomcat中文手册Jakarta-Tomcat 简明中文版用户指南第一部分本文档提供关于Tomcat的基础信息.主要内容如下:Tomcat二进制版本安装与Tomcat相关的脚本的主要内容与server.xml相关的主要内容,Tomcat的主要配置文件如何设置Tomcat与宿主web服务器一起工作的说明如何应用Tomcat配置一个现实中的web站点希望此文档足以使新用户可以开始使用Tomcat.如找不到某方面的内容请(按以下顺序)查找Tomcat faq查找Tomcat包清单向Tomcat用户邮件列表发出问题如此疑问的答案不存在,我们鼓励把对疑问的解答放入Tomcat faq 或此文档.如对此文档有意见或建议,请发送到Tomcat的邮件列表.Getting StartedTomcat是一个带有jsp环境的servlet容器.servlet容器是一个根据用户的行为可以管理和激活servlet的运行时的shell.粗略地可以将servlet容器分为如下几类:独立的servlet容器内置有web服务器的一部分.指当使用基于Java的web服务器的情形,例如servlet容器是JavaWebServer的一个部分. 独立的servlet容器是Tomcat的默认模式.大多数的web服务器并非基于Java,因此,我们可以得出如下两种容器的模式.进程内的servlet容器servlet容器作为web服务器的插件和Java容器的实现.Web服务器插件在内部地址空间打开一个JVM(java virtual machine)使Java容器得以在内部运行.如有某个需要调用servlet的请求,,插件将取得对此请求的控制并将他传递(使用JNI)给Java容器.进程内容器对于多线程,单进程的服务器非常合适并且提供很好的运行速度,但伸缩性有所不足.进程外的servlet容器servlet容器运行于web服务器之外的地址空间且作为web服务器的插件和Java容器的实现的结合.web服务器插件和Java容器JVM使用IPC机制(通常是TCP/IP)进行通讯.当一个调用servlet 的请求到达时,插件将取得对此请求的控制并将其传递(使用IPC 等)给Java容器,进程外容器的反应时间或进程外容器引擎不如进程内容器,但进程外容器引擎在许多其他可比的范围内更好(伸缩性,稳定性等).Tomcat既可作为独立的容器(主要是用于开发与调试)又可作为对现有服务器的附加(当前支持Apache,IIS和Netscape服务器).即任何时候配置Tomcat你都必须决定如何应用他,如选择第二或第三种模式,你还需要安装一个web服务器接口.Tomcat与Jserv有何区别?Tomcat是Jserv吗?这是个常见的误解.Jserv是Servlet API2.0兼容并与Apache一起使用的容器.Tomcat是一个完全重写的并与Servlet API2.2和JSP1.1兼容的容器.Tomcat使用了一些为Jserv而写的代码,特别是Jserv的Apache 接口,但这是唯一的相同之处.怎样安装Tomcat的二进制版本?非常简单,只需:下载 zip/tar.gz 任何压缩文件,从/download/binindex.html处.解压缩此文件到某目录(如:foo).将会生成一子目录,名为”tomcat”.转换到”tomcat”目录设置一新的环境变量(TOMCAT_HOME)指向你安装的tomcat的目录WIN32平台,键入:“set TOMCAT_HOME=fo o\tomcat”Unix平台:如是bash/sh环境, 键入:”TOMCAT_HOME=foo/tomcat;export TOMCAT_HOME”如是tcsh环境, 键入:”setenv TOMCAT_HOME foo/tomcat”设置环境变量JAVA_HOME指向你JDK的目录,然后添加JAVA解释器到你的PATH环境变量.好了!现在可以运行TOMCAT并作为一个独立的Servlet容器(模式一)启动与关闭Tomcat使用”bin”目录中的脚本启动与关闭Tomcat.启动:uinx:bin/startup.shwin32:bin\startup关闭:unix:bin/shutdown.shwin32:bin\shutdownTomcat目录结构假设你已将Tomcat解压,你已得到下列目录结构:目录名--描述bin包含启动/关闭脚本conf包含不同的配置文件,包括 server.xml(Tomcat的主要配置文件)和为不同的Tomcat配置的web应用设置缺省值的文件web.xmldoc包含各种Tomcat文档lib包含Tomcat使用的jar文件.unix平台此目录下的任何文件都被加到Tomcat的classpath中logsTomcat摆放日志文件的地方srcServletAPI源文件.先别高兴,这些只有些必须在Servlet容器内实现的空接口和抽象类webapps包含web项目示例此外你可以Tomcat会创建如下目录:workTomcat自动生成,放置Tomcat运行时的临时文件(如编译后的JSP 文件).如在Tomcat运行时删除此目录.JSP页面将不能运行. classes你可以创建此目录来添加一些附加的类到类路径中.任何你加到此目录中的类都可在Tomcat的类路径中找到自身.Tomcat的脚本Tomcat是一个Java程序,因此在设置好几个环境变量后即可用命令行的方式运行.然而设置Tomcat使用的每个环境变量和如下的命令行参数乏味且易错.因此,Tomcat开发组提供了一些脚本使启动和关闭Tomcat变得轻松.注意:这些脚本仅仅是个便利的方法去启动和关闭Tomcat.你可修改他们来定制CLASSPATH,环境变量如PATH,LD_LIBRARY_PATH,等等,只要是生成一个正确的命令行即可.这些脚本是什么呢?下表列出对一般用户最重要的脚本.tomcat主脚本.设置合适的环境变量,包括CLASSPATH,TOMCAT_HOME和JAVA_HOME和用适合的命令行参数启动Tomcatstartup在后台启动Tomcat.”tomcat start”命令的替换方式shutdown关闭Tomcat.”tomcat stop”命令的替换方式对用户最重要的脚本是tomcat(tomcat.bat/tomcat.sh).其他Tomcat相关的脚本作为一个简单的面向单任务的指向Tomcat脚本(设置不同的命令行参数等)的入口.仔细考察tomcat.bat/tomcat.sh,它按以下步骤运行:在Unix下的步骤:如未指定,推测 TOMCAT_HOME如未指定,推测 JAVA_HOME设置CLASS_PATH包含:1.${TOMCAT_HOME}/classes目录(如果存在)2.${TOMCAT_HOME}/lib的一切内容3.${JAVA_HOME}/lib/tools.jar(此jar文件包含工具javac,我们需要javac处理jsp文件.运行带有设定Java环境变量的命令行参数的java命令,调入tomcat.home,和org.apache.tomcat.startup.Tomcat 作为启始类.同时也传递命令行参数到org.apache.tomcat.startup.Tomcat ,例如:执行start/stop/run 等的操作此Tomcat进程使用指向server.xml的路径,例如server.xml放置于etc/server_1.xml并且用户意图在后台启动apache,键入如下命令行:bin/tomcat.sh start –f /etc/server_1.xml在Win32下的步骤:(略)由此可见,win32版的tomcat.bat与Unix版的几乎一致.尤其在它不推测TOMCAT_HOME和JAVA_HOME的值,并且不将所有的jar文件放入类路径中.Tomcat的配置文件Tomcat的配置基于两个配置文件:1.server.xml - Tomcat的全局配置文件2.web.xml - 在Tomcat中配置不同的关系环境这一部分将讲述如何使用这些文件.我们不会包含web.xml的内部机制,这些内部机制深入到了Servlet API的细节,因此,我们将讨论涵盖servler.xml内容及web.xml在Tomcat关系环境中的用法.server.xmlserver.xml是Tomcat的主配置文件.完成两个目标:1 提供Tomcat组件的初始配置.2 说明Tomcat的结构,含义,使得Tomcat通过实例化组件完成起动及构建自身, 如在server.xml所指定的下表描述server.xml种的重要元素:Jakarta-Tomcat 简明中文版用户指南第二部分元素及其描述Serverserver.xml文件中最重要的元素.Server定义了一个Tomcat服务器.一般你不用对他担心太多.Server元素能包含Logger和ContextManager元素类型Logger此元素定义一个Logger对象,每个Logger都有一个名字去标识,也有一个纪录Logger的输出和冗余级别(描述此日志级别)和包含日志文件的路径.通常有servlet的Logger(ServletContext.log()处),JSP和Tomcat运行时的Logger.ContextManagerContextManager说明一套ContextInterceptor, RequestInterceptor , Context和他们的Connectors的配置及结构.ContextManager有几个随同提供的特性:1. 用来纪录调试信息的调试级别2. webapps/,conf/,logs/和所有已定义的环境的基本位置.用来使Tomcat可以在TOMCAT_HOME外的其他目录启动.3. 工作目录的名字ContextInterceptor&RequestInterceptor这些侦听器(interceptors)侦听具体发生在ContextManager中的事件.例如,ContextInterceptor侦听Tomcat的启动及终止事件,RequestInterceptor监视在它服务过程中用户请求需要通过的不同阶段.Tomcat的管理员不必知道太多关于侦听器的知识;另外,开发者应该知道这是如何在Tomcat中实现一个”全局”型的操作(例如安全性及每个请求日志)ConnectorConnector表示一个到用户的联接,不管是通过web服务器或直接到用户浏览器(在一个独立配置中).Connector负责管理Tomcat的工作线程和读/写连接到不同用户的端口的请求/响应.Connector的配置包含如下信息:1.句柄类2.句柄监听的TCP/IP端口3.句柄服务器端口的TCP/IP的backlog.稍后我们将在此文档中描述如何配置Connector.Context每个Context提供一个指向你放置你Web项目的Tomcat的下属目录。
javaweb中监听器、过滤器、拦截器以及AOP的先后顺序和理解java web三⼤器:过滤器、拦截器、监听器(spring框架)spring、springMVC与springBoot的关系详见:⼀、启动顺序监听器---》过滤器---》拦截器案例理解:接到上级命令,要求对电话进去监听,过滤出恐怖分⼦,然后,拦截他们的恐怖袭击⾏动。
配置位置:监听器、过滤器⼀般配置在web.xml中,拦截器⼀般配置在springmvc.xml配置⽂件中⼆、概念监听器:Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接⼝的服务器端程序,它也是随web应⽤的启动⽽启动,只初始化⼀次,随web应⽤的停⽌⽽销毁。
主要作⽤是:做⼀些初始化的内容添加⼯作、设置⼀些基本的内容、⽐如⼀些参数或者是⼀些固定的对象等等Filter过滤器:过滤器拦截web访问url地址。
严格意义上讲,filter只是适⽤于web中,依赖于Servlet容器,利⽤Java的回调机制进⾏实现。
Filter过滤器:和框架⽆关,可以控制最初的http请求,但是更细⼀点的类和⽅法控制不了。
过滤器可以拦截到⽅法的请求和响应(ServletRequest request, ServletResponse response),并对请求响应做出像响应的过滤操作,⽐如设置字符编码,鉴权操作等⽐如:(不是login.do的地址请求,如果⽤户没有登陆都过滤掉),或者在传⼊servlet或者struts的action前统⼀设置字符集,或者去除掉⼀些⾮法字符。
主要为了减轻服务器负载,减少压⼒。
Interceptor拦截器:拦截器拦截以 .action结尾的url,拦截Action的访问。
Interfactor是基于Java的反射机制(APO思想)进⾏实现,不依赖Servlet容器。
拦截器可以在⽅法执⾏之前(preHandle)和⽅法执⾏之后(afterCompletion)进⾏操作,回调操作(postHandle),可以获取执⾏的⽅法的名称,请求(HttpServletRequest)Interceptor:可以控制请求的控制器和⽅法,但控制不了请求⽅法⾥的参数(只能获取参数的名称,不能获取到参数的值)(⽤于处理页⾯提交的请求响应并进⾏处理,例如做国际化,做主题更换,过滤等)。
Servlet的基本运行流程Servlet是Java Web中的一种技术,能够处理来自客户端的请求并生成响应。
它是在Web服务器上运行的Java类,可以与容器进行交互。
下面将详细描述Servlet的基本运行流程的步骤和流程。
1. Servlet的生命周期Servlet的生命周期包括以下三个阶段: - 初始化阶段(Initialization) - 服务阶段(Service) - 销毁阶段(Destroy)1.1 初始化阶段在Servlet类被加载到容器中时,(通常在Web应用程序启动时),容器会实例化Servlet对象,并调用其init()方法来进行初始化。
该方法只会在Servlet生命周期中被调用一次。
1.2 服务阶段一旦Servlet被初始化后,在其生命周期内,任何对Servlet的请求都会被容器处理。
当接收到一个客户端请求时,容器会创建一个新的线程,并调用Servlet的service()方法来处理该请求。
service()方法会根据请求的类型(GET、POST等)来调用相应的方法(如doGet()、doPost()等)进行处理。
1.3 销毁阶段当Web应用程序被关闭或Servlet容器被关闭时,容器会调用Servlet的destroy()方法来清除资源、释放内存和进行最后的操作,以完成Servlet的销毁过程。
2. Servlet运行流程Servlet的运行流程包括以下几个步骤:2.1 客户端发送请求当客户端(如浏览器)向Web服务器发送一个HTTP请求时,请求首先会到达Web容器。
2.2 容器寻找匹配的ServletWeb容器根据请求的URL来确定匹配的Servlet。
容器会维护一个Servlet映射表,将URL与对应的Servlet进行关联。
2.3 容器创建或获取Servlet实例如果Servlet实例不存在,则容器会创建一个新的Servlet实例,并调用其init()方法来进行初始化。
javaweb项⽬答辩答辩题总结(书本⽹上语⾔答辩+⾃⼰的语⾔答辩)答辩每个⼈的总分为1.5分。
每个⼈主要问3个问题。
开发流程===》系统架构====》项⽬模块+功能===》项⽬得失重定向与转发:?九个隐式对象?get与post的区辨:?jsp有静态包含,动态包含,两者的区辨:?什么是MVC:?web系统架构:?java web项⽬答辩总结试题注释:⽤楷体写的就是⽤⾃⼰组织的话来回答⽼师的问题。
1 http协议全名和特点(答辩⽼师:你对HTTP的是怎么理解的:答辩同学:⾸先HTTP是⼀种超⽂本传输协议,也是⼀种⽆状态的协议。
浏览器通过HTTP协议与web服务器交换信息,他处理信息交换的过程是:客户端和web服务器建⽴连接--->客户端发送HTTP请求--->服务器端接收客户端的HTTP请求,⽣成HTTP响应回发--->服务器端关闭连接HTTP请求,HTTP请求⾥有包含有请求⾏,请求头,空⾏,消息体。
HTTP响应⾥⼜包含状态⾏,响应码,空⾏,消息体。
)HTTP是⼀种超⽂本传输协议(HyperText Transfer Protocol),是⼀种⽆状态的协议;HTTP遵循请求/响应模型。
1.⽀持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求⽅法和路径。
请求⽅法常⽤的有GET、HEAD、POST。
每种⽅法规定了客户与服务器联系的类型不同。
由于HTTP协议简单,使得HTTP服务器的程序规模⼩,因⽽通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。
正在传输的类型由Content-Type加以标记。
4.⽆连接:⽆连接的含义是限制每次连接只处理⼀个请求。
服务器处理完客户的请求,并收到客户的应答后,即断开连接。
采⽤这种⽅式可以节省传输时间。
5.⽆状态:HTTP协议是⽆状态协议。
⽆状态是指协议对于事务处理没有记忆能⼒。
缺少状态意味着如果后续处理需要前⾯的信息,则它必须重传,这样可能导致每次连接传送的数据量增⼤。
SpringBoot系列——Logback⽇志,输出到⽂件以及实时输出到web页⾯ 前⾔ SpringBoot对所有内部⽇志使⽤通⽤⽇志记录,但保留底层⽇志实现。
为Java Util Logging、Log4J2和Logback提供了默认配置。
在不同的情况下,⽇志记录器都预先配置为使⽤控制台输出,同时还提供可选的⽂件输出。
默认情况下,SpringBoot使⽤Logback进⾏⽇志记录。
⽇志级别有(从⾼到低):FATAL(致命),ERROR(错误),WARN(警告),INFO(信息),DEBUG(调试),TRACE(跟踪)或者 OFF(关闭),默认的⽇志配置在消息写⼊时将消息回显到控制台。
默认情况下,将记录错误级别、警告级别和信息级别的消息。
PS:Logback does not have a FATAL level. It is mapped to ERROR Logback没有FATAL致命级别。
它被映射到ERROR错误级别 详情请戳官⽅⽂档: 本⽂主要记录Logback⽇志输出到⽂件以及实时输出到web页⾯ 输出到⽂件 我们创建SpringBoot项⽬时,spring-boot-starter已经包含了spring-boot-starter-logging,不需要再进⾏引⼊依赖 标准⽇志格式2014-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.522014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]2014-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]Date and Time: Millisecond precision and easily sortable. ⽇期和时间:毫秒精度,易于排序。
tomcat logging 级别
Tomcat 是一个开源的 Java Web 服务器和 servlet 容器,它提供了几种不同的日志记录级别,用于控制日志消息的详细程度。
这些日志级别包括:
- FATAL:表示严重的错误,导致应用程序无法继续运行。
- ERROR:表示错误情况,但应用程序可以继续运行。
- WARN:表示可能会出现问题,但不一定是错误。
- INFO:表示一般信息,用于监控应用程序的运行状态。
- DEBUG:表示详细的调试信息,通常用于开发和调试阶段。
通过设置不同的日志级别,可以控制 Tomcat 记录的日志消息的详细程度。
例如,可以将日志级别设置为 WARN,只记录警告和错误消息,而不会记录 INFO 和 DEBUG 消息,以减少日志量和提高性能。
要设置 Tomcat 的日志级别,可以通过修改 Tomcat 的配置文件来完成。
具体的配置文件位置和名称可能因操作系统和 Tomcat 版本而有所不同,但通常可以在 Tomcat 的安装目录下找到名为 catalina.properties 的文件。
在 catalina.properties 文件中,可以找到以下行:
```properties
logging.level.=INFO
```
将其修改为所需的日志级别,例如:
```properties
logging.level.=WARN
```
保存并重新启动 Tomcat,新的日志级别将生效。
需要注意的是,设置较高的日志级别可能会导致日志量增加,因此在生产环境中应根据实际需要选择适当的日志级别。
SpringBoot如何统计、监控SQL运⾏情况?写得太好了。
来源:/post/70625069231945810291 基本概念Druid 是Java语⾔中最好的数据库连接池。
虽然 HikariCP 的速度稍快,但是,Druid能够提供强⼤的监控和扩展功能,也是阿⾥巴巴的开源项⽬。
Druid是阿⾥巴巴开发的号称为监控⽽⽣的数据库连接池,在功能、性能、扩展性⽅⾯,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource 等等等,秒杀⼀切。
Druid 可以很好的监控 DB 池连接和 SQL 的执⾏情况,天⽣就是针对监控⽽⽣的 DB 连接池。
Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate中已经介绍 Spring Boot 2.x 默认使⽤ Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源。
⽽Druid已经在阿⾥巴巴部署了超过600个应⽤,经过好⼏年⽣产环境⼤规模部署的严苛考验!stat:Druid内置提供⼀个StatFilter,⽤于统计监控信息。
wall:Druid防御SQL注⼊攻击的WallFilter就是通过Druid的SQL Parser分析。
Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,⽐如说分库分表、审计等。
log4j2:这个就是⽇志记录的功能,可以把sql语句打印到log4j2 供排查问题。
2 添加依赖pom.xml<!-- 阿⾥巴巴的druid数据源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.23</version></dependency><!-- mysql8 驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--使⽤ log4j2 记录⽇志--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><!--mybatis,引⼊了 SpringBoot的 JDBC 模块,所以,默认是使⽤ hikari 作为数据源--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version><exclusions><!-- 排除默认的 HikariCP 数据源 --><exclusion><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></exclusion></exclusions></dependency>3 配置相关属性配置Druid数据源(连接池):如同以前 c3p0、dbcp 数据源可以设置数据源连接初始化⼤⼩、最⼤连接数、等待时间、最⼩连接数等⼀样,Druid 数据源同理可以进⾏设置;配置 Druid web 监控 filter(WebStatFilter):这个过滤器的作⽤就是统计 web 应⽤请求中所有的数据库信息,⽐如发出的 sql 语句,sql 执⾏的时间、请求次数、请求的 url 地址、以及seesion 监控、数据库表的访问次数等等。
servletfilter的执行顺序Servlet Filter是Java Servlet规范中的一种机制,用于在Web应用程序中对请求和响应进行预处理和后处理。
在Web应用程序中,Filter充当了请求链和响应链上的中间件,可以用于进行各种操作,例如身份验证、请求参数修改、日志记录等。
Servlet Filter的执行顺序取决于它们在web.xml中的注册顺序以及Filter的优先级设置。
1.在web.xml中注册Filter在web.xml配置文件中,可以为每个Filter指定一个或多个url-pattern,来指定它要处理的请求URI。
在注册Filter时,可以通过设置<filter-mapping>元素中的<url-pattern>元素来指定多个Filter的顺序以及它们处理的请求URI。
2. Filter的初始化在Servlet容器启动时,会对所有注册的Filter进行初始化。
Filter的初始化可以通过在Filter的初始化方法init()中完成。
在该方法中,可以对Filter的配置进行初始化,并加载任何需要的资源。
3.过滤器链的执行顺序当有请求到达Web应用程序时,Servlet容器会根据请求的URI匹配相应的Filter,然后按照注册的顺序依次调用它们的doFilter()方法。
Filter的doFilter()方法是Filter实际处理请求和响应的地方。
在doFilter()方法中,Filter可以对请求进行处理,并将请求传递给下一个Filter,或者将请求传递给servlet进行处理。
4. Filter链的结束如果已经到达了Filter链的末尾,或者在Filter链的中途其中一个Filter通过调用filterChain.doFilter()将请求传递给下一个Filter时,Filter链的处理就会结束。
5. Filter的销毁在Servlet容器关闭时,会对所有初始化的Filter进行销毁。
package com.action;/*** 管理员登陆增加修改删除删除登陆日志*/import java.io.IOException;import java.util.List;import java.util.StringTokenizer;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.bean.AdminBean;import com.bean.SystemBean;import com.util.Constant;import com.util.MD5;public class AdminAction extends HttpServlet {/*** Constructor of the object.*/public AdminAction() {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*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);}/*** 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 {response.setContentType(Constant.CONTENTTYPE);request.setCharacterEncoding(Constant.CHARACTERENCODING);try{String method=request.getParameter("method").trim();AdminBean loginbean = new AdminBean();HttpSession session = request.getSession();session.setMaxInactiveInterval(1200);SystemBean systembean = new SystemBean();String sysdir = systembean.getDir();if(method.equals("one")){//admin登录String username = request.getParameter("username");String password = request.getParameter("password");if(username == null||username.trim().equals("")){request.setAttribute("message", "请正确输入用户名!");request.getRequestDispatcher(sysdir+"/login.jsp").forward(request, response);}else if(password == null||password.trim().equals("")){request.setAttribute("message", "请输入密码!");request.getRequestDispatcher(sysdir+"/login.jsp").forward(request, response);}else{String md5password = MD5.MD5(password);String agent = request.getHeader("user-agent");StringTokenizer st = new StringTokenizer(agent,";");String useros=st.nextToken();String loginip = request.getRemoteAddr();int flag = loginbean.adminLogin(username,md5password, password,useros,loginip);switch (flag){case Constant.SUCCESS:List list = loginbean.getAdminInfo(username);session.setAttribute("user", username);session.setAttribute("list", list);request.getRequestDispatcher(sysdir+"/").forward(request, response);break;case _ERROR:request.setAttribute("message", "用户名错误!请确认管理权限!");request.getRequestDispatcher(sysdir+"/login.jsp").forward(request, response);break;case Constant.PASSWORD_ERROR:request.setAttribute("message", "密码错误,请确认管理权限!");request.getRequestDispatcher(sysdir+"/login.jsp").forward(request, response);break;}}}else if(method.equals("editpwd")){//admin edit passwordString username2 = (String)session.getAttribute("user");if(username2 == null){request.getRequestDispatcher("error.jsp").forward(request, response);}else{String oldpwd = MD5.MD5(request.getParameter("oldpwd").trim());String newpwd = MD5.MD5(request.getParameter("newpwd").trim());String username = (String)session.getAttribute("user");int flag = loginbean.editPassword(username, oldpwd, newpwd);switch (flag){case Constant.SUCCESS:request.setAttribute("message", "密码修改成功!");request.getRequestDispatcher(sysdir+"/system/editpwd.jsp").forward(request, response);break;case Constant.PASSWORD_ERROR:request.setAttribute("message", "原始密码错误,请确认权限!");request.getRequestDispatcher(sysdir+"/system/editpwd.jsp").forward(request, response);break;case Constant.SYSTEM_ERROR:request.setAttribute("message", "系统维护中,请稍后再试!");request.getRequestDispatcher(sysdir+"/system/editpwd.jsp").forward(request, response);break;}}}else if(method.equals("exit")){//admin exitString username2 = (String)session.getAttribute("user");if(username2 == null){request.getRequestDispatcher("error.jsp").forward(request, response);}else{session.removeAttribute("user");session.removeAttribute("list");System.gc();request.getRequestDispatcher(sysdir+"/login.jsp").forward(request, response);}}else if(method.equals("manager")){//add,update managerString username2 = (String)session.getAttribute("user");if(username2 == null){request.getRequestDispatcher("error.jsp").forward(request, response);}else{String ra = request.getParameter("ra").trim();if(ra.equals("add")){String username = request.getParameter("username").trim();String password = MD5.MD5(request.getParameter("password").trim());String isuse = request.getParameter("isuse").trim();if(isuse.equals("在用"))isuse = "1";elseisuse = "2";int flag = loginbean.addManager(username, password, "2", isuse);if(flag == Constant.SUCCESS){request.setAttribute("message", "增加管理员成功!");request.getRequestDispatcher(sysdir+"/system/user.jsp").forward(request, response);}else if(flag == Constant.SAME_NAME){request.setAttribute("username", username);request.setAttribute("message", "该用户名已经存在!");request.getRequestDispatcher(sysdir+"/system/user.jsp").forward(request, response);}else{request.setAttribute("message", "系统维护中,请稍后再试!");request.getRequestDispatcher(sysdir+"/system/user.jsp").forward(request, response);}}else if(ra.equals("update")){String username = request.getParameter("username").trim();String password = request.getParameter("password").trim();String isuse = request.getParameter("isuse").trim();if(!password.equals("")){password = MD5.MD5(password);}if(isuse.equals("在用"))isuse = "1";elseisuse = "2";int flag = loginbean.updateManager(username, password, "2", isuse);if(flag == Constant.SUCCESS){request.setAttribute("message", "修改管理员信息成功!");request.getRequestDispatcher(sysdir+"/system/user.jsp").forward(request, response);}else{request.setAttribute("message", "系统维护中,请稍后再试!");request.getRequestDispatcher(sysdir+"/system/user.jsp").forward(request, response);}}}}else if(method.equals("delm")){//delete managerString username2 = (String)session.getAttribute("user");if(username2 == null){request.getRequestDispatcher("error.jsp").forward(request, response);}else{int id = Integer.parseInt(request.getParameter("id").trim());if(id == 1){request.setAttribute("message", "不能删除原始帐号!");request.getRequestDispatcher(sysdir+"/system/user.jsp").forward(request, response);}else{int flag = loginbean.delManager(id);if(flag == Constant.SUCCESS){request.setAttribute("message", "删除成功!");request.getRequestDispatcher(sysdir+"/system/user.jsp").forward(request, response);}else{request.setAttribute("message", "系统维护中,请稍后再试!");request.getRequestDispatcher(sysdir+"/system/user.jsp").forward(request, response);}}}}else if(method.equals("dellog")){//delete login noteString username2 = (String)session.getAttribute("user");if(username2 == null){request.getRequestDispatcher("error.jsp").forward(request, response);}else{String check[] = request.getParameterV alues("checkit");if(check == null){request.setAttribute("message", "请选择要删除的记录!");request.getRequestDispatcher(sysdir+"/system/log.jsp").forward(request, response);}else{int id[]= new int[check.length];for(int i = 0;i<check.length;i++){int s = Integer.parseInt(check[i]);id[i] = s;}int flag = loginbean.delLog(id);if(flag == Constant.SUCCESS){request.setAttribute("message", "删除记录成功!");request.getRequestDispatcher(sysdir+"/system/log.jsp").forward(request, response);}else{request.setAttribute("message", "系统维护中,请稍后再试!");request.getRequestDispatcher(sysdir+"/system/log.jsp").forward(request, response);}}}}else{//无参数传入转到错误页面request.getRequestDispatcher("error.jsp").forward(request, response);}}catch(Exception e){e.printStackTrace();request.getRequestDispatcher("error.jsp").forward(request, response);}}/*** Initialization of the servlet. <br>** @throws ServletException if an error occure*/public void init() throws ServletException {// Put your code here}}。
Servlet是实现特殊接口的java类。
Jsp是servlet, 所以jsp也是java类。
1.servlet:输入:浏览器发送请求到服务器,服务器调用相应servlet. 输出:最终输出到客户端浏览器,服务器控制台。
2.普通java:输入:键盘。
输出:控制台。
3. serlvet运行必须在servlet容器中(服务器)。
Servlet类的继承关系:普通servlet→HttpServlet→GenericSerlvet→Object写第一个简单Sverlet:1.新建class, 继承:在输入框里输入HttpServlet.选(javax.servlet.http.HttpServlet)3.在web.xml中配置写好的servlet:注(<url-pattern>的问题):1.必须以/开头(不然,启动是会报错:invalid url-pattern ** in servlet mapping)2.常见的url的模式:a)<url-pattern>/one/*</url-pattern>→匹配所有one下面的请求b)<url-pattern>/one</url-pattern>→匹配one请求c)<url-pattern>*.one</url-pattern>→匹配所有.one结尾的请求错误写法:<url-pattern>/yi/*.one</url-pattern>4.发布或配置项目的方式。
1.发布按钮:发布:直接点击”发布按钮”将开发项目发布到tomcat目录webapps/下面。
访问:项目名+<url-pattern>2.server.xml:发布:在server.xml中<Host>下面增加一个<Context>元素:<C ontext path="/ab"doc B ase="D:\workspace3066\java310\WebRoot"reloadable="true" />访问:path属性+<url-pattern>3.增加xml文件:发布:在conf/Catalina/localhost下面增加一个xml文件,叫做:abc.xml, 文件内容为:<C ontext doc B ase="D:\workspace3066\java310\WebRoot"reloadable="true" />访问:文件名+<url-pattern>5.启动服务器,结合不同的发布方式访问:http://localhost:8080/+...doGet(),doPost()和service()的联系:doGet()的调用顺序:1. service() 2. super.service 3. doGet (doPost执行顺序也是类似)。
所以,service方法仍然是核心。
doGet,doPost常见异常:HTTP Status 405 - HTTP method POST is not supported by this URL:增加doPost()方法即可。
6个重要对象ServletConfig:用于处理在配置文件web.xml中,每个servlet初始化的参数。
ServletConfig sc = this.getServletConfig();方法:sc.getInitParameter("aaa")→返回名为aaa的参数的值Sc.getServletName()→取得所属servlet的名字sc.getInitParameterNames()→返回所有参数名的枚举ServletContext: 所有的servlet都共享同一个ServketContext对象,又称为ServletContext context = this.getServletContext();方法:context. getInitParameter(“aaa”)和context. getInitParameterNames()和ServletConfig的类似。
context.setAttribute(“a”,”AAA”)设置属性。
context.getAttribute(“a”)取得属性。
context.removeAttribute(“a”)删除属性。
context.getRealPath(“1.jsp”)用于获取文件绝对路径。
context.getResoursePaths(“/picture”)用于获取目录下的所有目录和文件的路径,返回Set类型。
HttpServletRequest::客户端的请求信息被封装在这个对象中。
获取请求基本信息获取网络连接信息获取请求头信息request.getHeader(“content-length”)和request.getHeaderNames()与ServletConfig的操作相似。
request.getContentType()和request.getContentLength()在请求方式为Post时才有用,上下文的类型和参数长度,他们和上面的getHeader功能一样,只不过因为常用才特意声明为方法。
获取请求参数利用请求域属性传值HttpServletResponse:服务器端的响应信息被封装在这个类中。
构建响应头消息addHeader(name,value)响应头是消息可写。
三种设置编码的方式response.setContentType("text/html;charset=gbk");response.setHeader("content-type", "text/html;charset=gbk");response.setCharacterEncoding("gbk");response.addHeader("refresh", "3;url=1.jsp");响应头的设置应在得到输出流(即: response.gerWriter())之前设置,否则无效。
response.getWriter().println, print, write三个方法的区别:1. write方法遇到Null时抛出空指针异常。
print,println则直接打印null2. 换行指的是html源码换行,并不是页面显示时换行。
请求重定向和请求转发: 不论用什么跳转,之后的语句还是会被执行,一般在之后加上return;请求重定向response.sendRedirect(URL);1.地址栏改变,可以访问本web应用以外的资源。
2.整个过程发送两次请求。
3.不加/是相对本servlet所在目录,加/表示端口号后面的根目录http://localhost:8080/4.sendRedirect后面语句仍然会被执行,所以一般加return .请求转发request.getRequestDispatcher("LoginPage").forward(request,response);1.地址栏不改变,只能访问自己web应用的资源。
2.整个过程是一次请求。
3.不加/是相对本servlet,加/表示web应用的根目录http://localhost:8080/jsp/4.还可以this.getServletContext().getRequestDispatcher("/1.jsp").forward(request,response);5.请求转发之后的语句仍然会被执行。
所以,一般在该语句执行之后加return.6.由于多个servlet之间属于同一个请求,共享同一个request对象,所以可以通过request作用域来共享传递一些信息。
过程示例:HttpSession:将http状态信息保存在服务器端的技术。
取得:HttpSession session = request.getSession();方法:session.getId() 返回相关联的session的id。
session.setMaxInactiveInterval(6) 以秒为单位设置session的最大空闲时间,可以在web.xml中<session-config>中配置空闲时间。
session.invalidate() 强制session失效。
利用属性设置来传递参数,与request的操作一样。
Session空闲时间的设置:1.setMaxInactiveInterval(7) ; 设置7秒后过期2.通过web.xml中的配置:<session-config><session-timeout>30</session-timeout></session-config>3. invalidate() ;使当前session对象强制失效。
Session作为作用域保存传递信息。
Cookie:将http状态信息保存在客户端的技术。
注意!IE: c:/document and settting/ccc/ cookies/取得:Cookie cookie = new Cookie("uname","dabao");方法:cookie.setMaxAge(3600*24);设置cookie的有效期setName() setValue()getName() getValue()添加cookie:response.addCookie(cookie);取得cookie: request.getCookies();返回Cookie[]类型的数组,再用getName() getValue()来访问它的Name和Value。
火狐的cookie用火狐的设置选项查看。
登录系统/退出系统练习:(由于没有学数据库,只能先模拟实现。
本练习全部用servlet实现)1.登录页面:表单:用户名、密码。
2.用户输入后,提交到服务器进行处理,如果”jiangnan,123”,则用户名正确,跳转到登录成功页面,将”jiangnan”放入session中。
如果不是”jiangnan,123”,则返回登录页面,让用户重新输入,并且提示“用户名或密码错误,请重新输入”。