freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

代码审计学习2-JavaWeb
2024-04-15 22:13:15

前言

啊啊啊啊啊啊啊啊,写了2个小时被吞了,心态崩了,又又又重写,可恶!!!!

为了更通俗易懂,先说一下我对jsp,filter,servlet之间关系的理解。浅薄的表述一下,不能完全涵盖内容,但是大体是没错的。设想一种情景,我们需要去过红绿灯(某个任务),红灯变成绿色,绿色光线(jsp)传到我们的眼睛(filter),眼睛(filter)看到光线得到信息(红灯变绿了)传给大脑(servlet),大脑(servlet)得到信号做出反应,过了红绿灯。完成整个事件。但这只是简单的例子,包含并不全面,实际还有servlet处理完之后可能还需要filter和jsp进行处理展示等。大多数filter位于jsp和servlet之间,也有些在servelet处理之后再处理数据。接下来详细介绍一下我对这3部分的粗浅理解。

因为本身是新入门,理解可能有不到位的地方,欢迎大家指正!谢谢!

1.jsp

1.1jsp和html的区别

我之前一直觉得这俩没啥区别,后来才知道,jsp最大的优点在于能够动态交互,效率也更高。

JSP(JavaServer Pages)和 HTML(Hypertext Markup Language)之间有一些关键区别。

  • 技术类型:HTML 是一种静态页面技术,由浏览器解释执行。它用于描述文档中基于文本的信息结构。
    JSP 是一种动态网页开发技术,运行在服务器端。它允许在 HTML 文件中插入 Java 代码。
  • 生成页面:HTML 生成静态网页,内容固定,不会变化。JSP 生成动态网页,内容可以根据不同用户或不同时刻的请求而变化。
  • 运行机制:HTML 运行在客户端,由浏览器解释执行。JSP 运行在服务器端,需要 Web 容器提供运行环境。
  • 用途:HTML 侧重于静态数据展示,主要用于构建网页结构。JSP 侧重于与服务器交互,用于动态网页开发。
  • 关系:JSP 文件是一个带有 Java 代码的 HTML 文件。JSP 允许在 HTML 文件中插入 Java 代码。


总之,JSP 是一种创建动态 Web 应用程序的技术,而 HTML 是用于创建 Web 页面结构的标准标记语言。总的来说,两者差别存在,但是也有相同的地方。

1.2jsp的相关内容

  • JSP 的作用:                                                                                                                                             1.替代 Servlet 程序回传 HTML 页面的数据。相比于直接在 Servlet 中编写 HTML,使用 JSP 更加方便简洁。
    2.JSP 可以与处理业务逻辑的 Servlet 一起使用,实现动态网页的开发。
  • JSP 的优势
    1.性能优越:JSP 可以直接在 HTML 页面中嵌入元素,无需单独引用 CGI 文件,提高性能。
    2.强大的 Java API 支持:JSP 基于 Java Servlet API,可以使用各种强大的 Java API,如 JDBC、JNDI、EJB、JAXP 等。
    3.与 Servlet 结合使用:JSP 可以与处理业务逻辑的 Servlet 一起使用,实现更复杂的功能。
    4.完整的企业级应用平台:JSP 是 Java EE 不可或缺的一部分,可以用最简单的方式实现复杂的应用。
  • JSP 的本质
    1.JSP 页面本质上是一个 Servlet 程序。
    2.当第一次访问 JSP 页面时,服务器会将其翻译成 Java 源文件并编译成字节码程序。
    3.JSP 最终被执行为 Servlet 程序,通过输出流将 HTML 页面数据回传给客户端。

总之,JSP 是一种用于动态网页开发的技术,允许在 HTML 页面中嵌入 Java 代码,实现动态生成内容。我个人觉得他重点就在于能动态,高效的处理任务。这是核心优点。


2.filter

2.1什么是filter

filter我个人觉得就像一种规则,之前感觉跟servlet没啥区别,都是对数据的处理,但是仔细深究发现差出老远了。filter像是一种规则,然后servlet像是一种行为集合,就像吃饭你就需要拿起碗和筷子,filter就像是检查一下碗和筷子是不是干净的。

2.2Filter主要作用

  • 数据筛选:Filter能够根据预设的条件或规则,从数据集合中筛选出符合特定要求的数据项,排除不符合条件的数据。
  • 数据转换:Filter能够对筛选出的数据进行转换,包括格式转换、类型转换等,以满足后续处理或展示的需求。
  • 请求拦截:在Web开发中,Filter可以拦截客户端向服务器发送的请求,对请求进行预处理,如验证用户身份、过滤敏感信息等。
  • 响应处理:Filter还可以拦截服务器对客户端的响应,对响应数据进行处理,如添加头部信息、进行编码转换等,再返回给客户端。
  • 通用功能实现:通过Filter,可以实现一些通用的预处理操作,如权限控制、日志记录等,避免在每个处理逻辑中重复编写相同的代码。

综上所述,Filter的作用涵盖了数据筛选、数据转换、请求拦截、响应处理以及通用功能实现等多个方面,能够帮助我们更有效地处理和分析数据,提升应用的灵活性和可维护性。这都是官方套话,主要就是做数据的控制,servlet是数据的综合行为。

3.servlet

3.1什么是servlet

简单来说,Servlet是一种服务器端的Java应用程序,用于拓展服务器的功能,可以生成动态的Web页面,并在客户端和服务器之间传递数据。Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,具有独立于平台和协议的特性。其主要功能在于交互式地浏览和生成数据,生成动态Web内容。

我个人认为客户端和服务端进行通信,servlet就是服务端的大脑(处理器)。

3.2servlet作用

Servlet 是运行在 Web 服务器或应用服务器上的 Java 程序,作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

它具有以下特点:

  • 接收和处理请求:Servlet 可以接收来自客户端(浏览器)的请求,包括网页上的 HTML 表单数据,或者来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 处理数据并生成结果:Servlet 可以访问数据库、执行 RMI 或 CORBA 调用、调用 Web 服务,或者直接计算得出对应的响应。
  • 响应客户端:Servlet 可以将生成的结果发送给客户端,响应的格式可以是文本文件(如 HTML 或 XML)、二进制文件(如 GIF 图像)等。

4.例子程序

咱们来个简单的登录例子结合来看下,登录来进行用户名检查,不允许中文字符吧。

4.1jsp-login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>Login Page</title>
</head>
<body>
    <h2>Login Form</h2>
    <form action="login" method="post">
        Username: <input type="text" name="username" required="required" /><br/>
        Password: <input type="password" name="password" required="required" /><br/>
        <input type="submit" value="Login"/>
    </form>
</body>
</html>

4.2filter-UsernameCheckFilter.java

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.io.PrintWriter;

@WebFilter("/login")
public class UsernameCheckFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        String username = request.getParameter("username");
        if (username != null && username.matches(".*[\\u4e00-\\u9fa5]+.*")) {
            response.setContentType("text/html; charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println("<html><body>");
            out.println("<p>Error: Username must not contain Chinese characters.</p>");
            out.println("</body></html>");
        } else {
            chain.doFilter(request, response);
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
        // Filter initialization code can be added here
    }

    public void destroy() {
        // Filter destruction code can be added here
    }
}


4.3servlet-LoginServlet.java

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("admin".equals(username) && "password".equals(password)) {
            response.sendRedirect("welcome.jsp"); // 登录成功,重定向到欢迎页面
        } else {
            response.sendRedirect("login.jsp?error=true"); // 登录失败,重定向回登录页面并显示错误信息
        }
    }
}

4.4配置文件-web.xml

<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">
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>UsernameCheckFilter</filter-name>
        <filter-class>UsernameCheckFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>UsernameCheckFilter</filter-name>
        <url-pattern>/login</url-pattern>
    </filter-mapping>
</web-app>


总的来说这个例子还是很简单易懂的,铁子们,再会!

# java # Java代码审计
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录