首先要提到的是Java Web的第三大组件:Servlet、Filter、Listener,这三个组件在Java Web中提供不同的功能,但对于Java安全来讲,这三个必须要进行了解,因为后续会涉及到这三个组件的使用。
Servlet服务
Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自HTTP客户端的请求和HTTP服务器的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。
工作流程
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步。
装载并创建该Servlet的一个实例对象。
调用Servlet实例对象的init()方法。
创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
创建和使用
创建包名为 com.example.javaweb
创建Servlet
创建一个类继承HttpServlet(以 IndexServlet
为例)
public class IndexServlet extends HttpServlet {
}
注册Servlet
web.xml
在 webapp/WEB-INF
中的 web.xml
中添加
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<servlet>
<servlet-name>Index</servlet-name>
<servlet-class>com.example.javaweb.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Index</servlet-name>
<url-pattern>/Index</url-pattern>
</servlet-mapping>
</web-app>
WebServlet
@WebServlet("/Index")
public class IndexServlet extends HttpServlet {
}
内置方法(常见五种)
调用方法时都是调用最新的(重写情况)
方法顺序
方法顺序为 init()->[service()->doGet()/doPost()]->destory()
生命周期
处理接受和回显
HttpServletRequest方法
HttpServletRequest是ServletRequest的子接口,它有获取一系列传入参数、值的方法,详见:https://www.runoob.com/servlet/servlet-client-request.html
HttpServletResponse方法
HttpServletResponse是ServletResponse的子接口,它有一系列设置、修改返回值的方法,详见:https://www.runoob.com/servlet/servlet-server-response.html
PrintWriter getWriter()
PrintWriter out = resp.getWriter();
// 获取一个 'PrintWriter' 字符输出流输出数据的对象
out.write("Hello Hacker!");
// 在页面上输出 "Hello Hacker!"
Filter过滤器
Filter被称为过滤器,其作用是对Web资源进行拦截,做完一系列的处理后交给下一个Filter或Servlet进行处理,既可以对Request请求进行拦截处理,也可以对Response响应进行拦截修改。
工作流程
web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源(Servlet)。
创建和使用
创建Filter
创建一个HttpFilter类的对象,(以 IndexFilter
(对象) 为例)
public class IndexFilter extends HttpFilter {
}
注册Filter
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<filter>
<filter-name>Index</filter-name>
<filter-class>com.example.javaweb.IndexFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Index</filter-name>
<url-pattern>/Index</url-pattern>
</filter-mapping>
</web-app>
WebFilter
@WebFilter("/Index")
public class IndexFilter extends HttpFilter {
}
内置方法
方法顺序
方法顺序为 init()->doFilter()->destory()
生命周期
init()方法:程序启动时调用(创建)
destory():程序停止时调用(摧毁)
doFilter():收到访问请求符合条件调用,并且都会在 doGet()和 doPost()之前;程序第一次运行会在Servlet调用init()后调用。
安全场景
Payload检测,权限访问控制,内存马植入,清理内存马等
内存马参考:https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw
Listener监听器
Listener监听器是用来监听ServletText、HttpSession和ServletRequest等域对象发生修改的事件(如创建,销毁),它可以在事件发生前、后执行一段程序。
监听器类型
根据监听事件的类型可以分成三类:
对象的创建与销毁
对象的属性变更
HttpSession 中的对象状态改变
监听对象
监听属性
监听HttpSession状态
创建和使用
创建Listener
创建三个类(ListenObject、ListenAttribute、ListenState),实现三种监听器接口(Listener)
// ListenObject 监听对象的创建与销毁
public class ListenObject implements ServletContextListener,
HttpSessionListener,
ServletRequestListener {
}
// ListenAttribute 监听对象属性的变更
public class ListenAttribute implements ServletContextAttributeListener,
HttpSessionAttributeListener,
ServletRequestAttributeListener {
}
// ListenState 监听对象状态的变化
public class ListenState implements HttpSessionBindingListener,
HttpSessionActivationListener {
}
注册Listener(以 ListenObject 为例)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<listener>
<listener-class>com.example.javaweb.ListenObject</listener-class>
</listener>
</web-app>
WebListener
@WebListener
public class ListenObject implements ServletContextListener,
HttpSessionListener,
ServletRequestListener {
}
监听器启动顺序
使用场景
常用于统计网站在线人数、系统加载时进行信息初始化、统计网站访问量等等
参与讨论