Java知识点:
功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
安全:原生开发安全,第三方框架安全,第三方库安全等,待补充
JavaEE-HTTP-Servlet&路由&周期
参考:https://blog.csdn.net/qq_52173163/article/details/121110753
1、解释
Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。本章内容详细讲解了web开发的相关内容以及servlet相关内容的配置使用,是JAVAEE开发的重中之重。
2、创建和使用Servlet
-创建一个类继承HttpServlet
-web.xml配置Servlet路由
-WebServlet配置Servlet路由
-写入内置方法(init service destroy doget dopost)
3、Servlet生命周期
4、处理接受和回显
HttpServletRequest是ServletRequest的子接口
getParameter(name) — String 通过name获得值
getParameterValues — String[] 通过name获得多值
HttpServletResponse是ServletResponse的子接口
setCharacterEncoding() 设置编码格式
setContentType() 设置解析语言
getWriter() 获得一个PrintWriter字符输出流输出数据
PrintWriter 接受符合类型数据
IDEA配置
- 打开idea
- 创建javaEE项目
- 项目模板选用Web程序,创建Tomcat服务器
- 下载JDK1.8稳定版
- 选择javaEE 8创建项目即可
- 点击运行,即可看到网页页面
然后一路 next, 可能报错 javaee9 至少需要 java11 支持,直接将 javaee9 换为 javaee8 即可
要记得添加框架支持:Web框架,JavaEE框架支持
Facet 是 IntelliJ IDEA 中用于向项目添加功能和框架支持的概念,它提供了配置选项和功能集合。使用 Facet 可以集中管理项目的不同功能和框架的设置和依赖项,提高项目的可维护性和开发效率。
工件是通过编译、打包、构建等过程生成的最终结果。例如,在 Java 中,编译 Java 源代码将生成编译后的字节码文件(.class 文件)作为工件。
Tomcat工件部署
Servlet & 路由 &周期
JavaEE的核心-Servlet:https://blog.csdn.net/qq_52173163/article/details/121110753
Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet 可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。本章内容详细讲解了 web 开发的相关内容以及 servlet 相关内容的配置使用,是 JAVAEE 开发的重中之重。
创建和使用Servlet
创建一个类继承HttpServlet
web.xml配置Servlet路由
这样也可以
写入内置方法(init service destroy doget dopost)
package com.example.demo1; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @WebServlet("/a") public class IndexServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // HttpServletRequest是ServletRequest接口的子接口,提供了用于处理HTTP请求的额外功能。 // HttpServletResponse是ServletResponse接口的子接口,提供了用于处理HTTP响应的额外功能。 System.out.println("--------------doGet"); // 通过参数名获取请求中的值。返回一个String,表示与给定参数名相对应的单个值。 String id =req.getParameter("id"); // 设置响应内容的类型和编码。常用于指定输出的数据类型,如HTML、JSON等。 resp.setContentType("text/html;charset=utf-8"); // PrintWriter是用于向客户端输出字符数据的类,可以接受各种数据类型,然后将其转换为文本并发送到客户端。 // 通过 resp.getWriter() 获取一个 PrintWriter 对象,用于向客户端返回响应数据。 PrintWriter out = resp.getWriter(); // 向客户端发送数据 out.println("这是GET请求的数据:"); out.println("id:"+id+"<br>"); // 通过调用 out.flush() 刷新缓冲区,并调用 out.close() 关闭 PrintWriter 对象。 out.flush(); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); out.println("这是post提交的数据"); out.println(name); out.flush(); out.close(); // 打印一条日志到终端 System.out.println("--------------doPost"); } // 当Servlet首次创建时调用的初始化方法 @Override public void init(ServletConfig config) throws ServletException{ System.out.println("--------------init"); // try { // Class.forName("com.example.servletdemo.NewsServlet"); // // } catch (ClassNotFoundException e) { // throw new RuntimeException(e); // } } // 当Servlet被销毁时调用的方法 @Override public void destroy() { System.out.println("--------------destroy"); super.destroy(); } // 处理GET和POST请求的服务方法 @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("--------------http service"); super.service(req, resp); } // 覆盖的用于ServletRequest和ServletResponse的服务方法 @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("--------------Servlet service"); super.service(req, res); } }
Servlet声明周期
初次启动程序,终端没有表现,说明Servlet未被创建
使用get访问这个Servlet
关闭Servlet时
Servlet生命抽泣
JavaEE-数据库-JDBC&Mybatis&库
原生态数据库开发:JDBC
参考:https://www.jianshu.com/p/ed1a59750127
JDBC(JavaDatabase connectivity): 由java提供,用于访问数据库的统一API接口规范.数据库驱动: 由各个数据库厂商提供,用于访问数据库的jar包(JDBC的具体实现),遵循JDBC接口,以便java程序员使用!
1、下载jar
2、引用封装jar
创建lib目录,复制导入后,添加为库
3、注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
4、建立数据库连接
String url ="jdbc:mysql://localhost:3306/demo01";
Connection connection=DriverManager.getConnection(url,"x","x");
5、创建Statement执行SQL
Statement statement= connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
6、结果ResultSet进行提取
while(resultSet.next()){
int id = resultSet.getInt("id");
String page_title = resultSet.getString("page_title");
.......
}
安全修复SQL注入:预编译
原理:提前编译好执行逻辑,你注入的语句不会改变原有逻辑!
-框架数据库开发:Mybatis
Mybatis是一款优秀的持久层框架,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,减少了代码的冗余,减少程序员的操作。
1、下载Jar包:https://mvnrepository.com/
2、引用jar包,创建lib目录,复制导入后,添加为库
添加为库
3、注册数据库驱动
JDBC(Java Database Connectivity)是 Java 用于与数据库交互的 API,而不同的数据库供应商提供了各自的 JDBC 驱动程序。在这里,"com.mysql.jdbc.Driver" 是 MySQL JDBC 驱动程序的类名。
加载和初始化: 当调用 Class.forName("com.mysql.jdbc.Driver"); 时,它会尝试查找、加载并初始化指定的类。在这个过程中,MySQL JDBC 驱动程序的静态代码块(static {...})会被执行,这通常用于注册驱动程序。
- 在旧版本的 MySQL 驱动中,com.mysql.jdbc.Driver 是驱动类的完整路径。
- 在新版本中,com.mysql.cj.jdbc.Driver 是 MySQL Connector/J 的驱动类。
4、建立数据库连接
Class.forName("com.mysql.jdbc.Driver");
// 定义数据库连接的URL,格式为:jdbc:mysql://host:port/database
String url = "jdbc:mysql://localhost:3306/dome01";
// 使用DriverManager获取数据库连接
Connection connection = DriverManager.getConnection(url, "root", "root");
// 打印数据库连接信息
System.out.println(connection);
5、创建Statement执行SQL
connection.createStatement();: 在Connection对象上调用createStatement方法,创建一个Statement对象。Statement对象用于执行SQL语句,它可以执行静态的SQL查询、更新、删除等操作。createStatement方法返回一个新的Statement对象。
创建一个Statement对象,然后使用该对象执行给定的SQL查询语句,将查询结果存储在一个ResultSet对象中。这样,您可以通过遍历ResultSet来检索和处理查询的结果集中的数据。
6、结果ResultSet进行提取
package com.example.demo1;
import java.sql.*;
public class NewsServlet{
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载 MySQL 驱动程序
Class.forName("com.mysql.jdbc.Driver");
String url ="jdbc:mysql://localhost:3306/demo01";
// 通过调用 DriverManager.getConnection() 方法,你可以获取到一个 Connection 对象,
// 该对象表示与数据库的连接。你可以使用这个 Connection 对象执行 SQL 语句和事务操作。
Connection connection = DriverManager.getConnection(url,"root","123456");
System.out.println(connection);
String sql="select * from news";
//危险写法
//String vulsql="select * from news where id="+id;
//预编译写法
String safesql="select * from news where id=?";
System.out.println(sql);
// connection.createStatement() 是用来创建一个 Statement 对象,
Statement statement= connection.createStatement();
// 而 statement.executeQuery(sql) 是用来执行 SQL 查询并返回结果集。
ResultSet resultSet = statement.executeQuery(sql);
// resultSet.next() 方法用于将结果集的指针移动到下一行,并返回一个布尔值,
// 表示是否还有更多行可供遍历。通过使用 while 循环,可以在结果集还有下一行的情况下不断迭代。
while (resultSet.next()){
// resultSet.getInt("id") 用于获取当前行 "id" 列的整数值,并将其赋给变量 id。
int id = resultSet.getInt("id");
String page_title = resultSet.getString("page_title");
String heading = resultSet.getString("heading");
String subheading = resultSet.getString("subheading");
String content = resultSet.getString("content");
String img = resultSet.getString("img");
System.out.println(id+"|"+page_title+"|"+heading+"|"+subheading+"|"+content+"|"+img);
}
}
}
安全修复SQL注入:预编译
原理:提前编译好执行逻辑,你注入的语句不会改变原有逻辑!
- 预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ? 是一个占位符,表示将在执行时动态替换。
- 使用 PreparedStatement: PreparedStatement 是 Statement 的子接口,用于执行预编译的 SQL 语句。通过调用 connection.prepareStatement(safesql) 创建一个 PreparedStatement 对象。
- 设置参数: 使用 setXXX 方法设置占位符的值。在这里,使用 setInt(1, id) 将 id 的值设置到第一个占位符上。这种方式防止了 SQL 注入攻击,因为参数值是通过预编译的方式传递的,而不是通过直接拼接字符串。
- 执行查询: 调用 executeQuery() 执行查询,得到 ResultSet 对象。
- 处理结果集: 根据业务需要,处理查询结果集的数据。
// 预编译写法 String safesql = "SELECT * FROM news WHERE id=?"; // 使用PreparedStatement try (PreparedStatement preparedStatement = connection.prepareStatement(safesql)) { **// 设置参数,防止SQL注入攻击 preparedStatement.setInt(1, id);** // 执行查询 ResultSet resultSet = preparedStatement.executeQuery(); // 处理结果集... } catch (SQLException e) { e.printStackTrace(); }
相比较于直接拼接 SQL 语句的方式,预编译语句提供了更好的安全性,可以防止SQL注入攻击。在使用预编译语句时,务必通过参数设置的方式传递值,而不要直接拼接值到 SQL 语句中。
思维导图
版权归原作者 Dao-道法自然 所有, 如有侵权,请联系我们删除。