22-IDEA项目创建打包&反编译

1、使用IDEA创建一个servlet web项目,并打包成war文件

  • 在主菜单中选择【文件】> 【新建】>【项目】

    • 在新建项目对话框中,选择Jakarta EE。
    • 输入项目名称:hello-jakartaee
    • 选择Web 应用程序模板,使用 Maven作为构建工具,并使用 Oracle OpenJDK 11 作为项目SDK;不要选择或添加应用程序服务器,我们稍后会进行操作。

    单击“下一步”继续。

    image-20250302160259501

  • 在版本字段中,选择 Jakarta EE 10,因为和后续使用的 Tomcat 10 兼容;依赖项中选择Servlet框架即可。点击创建

    image-20250302160352558

  • 创建完成,目录结构如下:

    image-20250302160458886

  • 打包为war文件

    • 右击”m“,打开maven视窗

    • 双击package生成打包文件hello-jakartaee-1.0-SNAPAHOT.war

      image-20250302160600963

2、安装tomcat 10并成功启动,部署上一步中生成的war文件

  • 下载 Tomcat ,这里选择apache-tomcat-10.1.30版本,下载解压后目录结构如下

    image-20250302152318646

    • 启动tomcat10,在 bin 目录下运行startup.bat(注意:tomcat10 兼容版本为 java11+ )
      image-20250302152737838

    • 访问localhost:8080出现下面页面,说明启动成功

      image-20250302152801040

  • 部署war文件

    • 方法一:将war文件复制到apache-tomcat-10.1.30\webapps目录下,并将文件重命名为test.war(方便后续访问);启动tomcat之后会新生成一个test目录即部署完成。访问如下

      image-20250302161556239

    • 方法二:在IDEA里配置应用程序服务器,完成在IDEA里对war文件的部署

      • 在主菜单栏 >【在运行/调试配置】>【编辑配置】,单击+,选择添加【Tomcat 服务器】>【本地】

      • 配置选择tomcat10所在的目录之后,底部会弹出警告,点击修复,需要修复下面问题:

        在“部署”选项卡上,添加要部署的工件:hello_Jakartaee:war exploded;URL会自动指向http://localhost:8080/hello jakartaee_war_exploded/

        image-20250302162116295

      • 确定,保存运行配置;运行tomcat,成功实现

        image-20250302164200788

        image-20250302164412572

3、参考课件,完善第一步的web项目,实现基于Session的认证功能

  • 项目结构

    • 需要一个登入页面(IndexServlet)
    • 登入验证页面(SignInServlet)
    • 登入成功后用户页面(AdminServlet)
    • 用户退出登入功能(SignOutServlet)
  • 实现

    • IndexServlet

      image-20250303120953333

      image-20250303121022237

    • SignInServlet

      @WebServlet(urlPatterns = "/signin")
      public class SignInServlet extends HttpServlet {
          // 模拟一个数据库:
          private Map<String, String> users = Map.of("bob", "bob123", "alice", "alice123", "tom", "tomcat");
      
          // GET请求时显示登录页:
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              resp.setContentType("text/html");
              PrintWriter pw = resp.getWriter();
              pw.write("<h1>Sign In</h1>");
              pw.write("<form action=\"/signin\" method=\"post\">");
              pw.write("<p>Username: <input name=\"username\"></p>");
              pw.write("<p>Password: <input name=\"password\" type=\"password\"></p>");
              pw.write("<p><button type=\"submit\">Sign In</button> <a href=\"/\">Cancel</a></p>");
              pw.write("</form>");
              pw.flush();
          }
      
          // POST请求时处理用户登录:
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              String name = req.getParameter("username");
              String password = req.getParameter("password");
              String expectedPassword = users.get(name.toLowerCase());
              if (expectedPassword != null && expectedPassword.equals(password)) {
                  // 登录成功:
                  req.getSession().setAttribute("user", name);
                  resp.sendRedirect("/admin");
              } else {
                  resp.sendError(HttpServletResponse.SC_FORBIDDEN);
              }
          }
      }
      

      上述代码可知SignInServlet 在判断用户登录成功后,立刻将用户名放入当前 HttpSession 中且服务器会自动创建⼀个Session ID名为 JSESSIONID 然后通响应头Set-Cookie发送给浏览器

      image-20250303122806092

    • AdminServlet( HttpSession 取出用户名)

      image-20250303124120998

      image-20250303123907203

    • SignOutServlet(登出逻辑就是从 HttpSession 中移除用户相关信息)

      image-20250303124600477

4、使用Filter组件,优化第一步的web项目,添加认证功能。

  • 在没有使用filter组件时,发现无需登入就可以直接访问用户界面,这是不合理的需要进一步的优化

    image-20250303130336004

  • 添加 AuthFilter 类,使用 Filter 组件对能直接访问 admin 页面的行为进行过滤

    image-20250303133229709

  • 添加完成后,开启运行和调试,再次访问 http://localhost:8080/admin 发现进入到了 AuthFilter 模块里,证明 Filter 组件生效

    image-20250303132028621

  • 放行后跳转到了登入页面,说明过滤成功

    image-20250303132109796

5、使用IDEA创建一个SpringBoot项目,并打包成jar包

  • 在主菜单中选择【文件】> 【新建】>【项目】

    • 在新建项目对话框中,选择Spring Boot
    • 输入项目名称:hello-springboot
    • Maven作为构建工具,JDK选择对应 Oracle OpenJDK 17

    单击“下一步”继续。

    image-20250303151400134

  • 选择依赖项【web】> Spring Web

    image-20250303151501225

  • 创建完成,目录结构如下:

    image-20250303154631793

    • 完善 Spring Boot 代码

      • 编辑 HelloSpringbootApplication.java,添加 CommentsImports 的方法

        image-20250303161753138

      • 创建的 Spring Boot 应用程序端点位于 /hello,直接访问 http://localhost:8080 会报错,需要添加一个静态 HTML 页面(在 /src/main/resources/static/ 下创建index.html文件)

        <!DOCTYPE HTML>
        <html>
        <head>
            <title>Your first Spring application</title>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        </head>
        <body>
        <p><a href="/hello">Greet the world!</a></p>
        <form action="/hello" method="GET" id="nameForm">
            <div>
                <label for="nameField">How should the app call you?</label>
                <input name="myName" id="nameField">
                <button>Greet me!</button>
            </div>
        </form>
        </body>
        </html>
        

        运行程序,访问 http://localhost:8080/,出现如下画面证明 Spring Boot 项目完善成功

        image-20250303162719113

        image-20250303163415313

  • 打包成jar包

    • 右击”m“,打开maven视窗 > 【生命周期】

    • 双击package生成打包文件hello-springboot-0.0.1-SNAPSHOT.jar

      image-20250303164259995

6、通过jd-gui,对第5步生成的jar包进行反编译。

  • 下载 jd-gui 完成后点击运行 jd-gui.exe 来准备对jar包进行反编译

    image-20250303165948831

    • 点击左上角的 file > openfile 打开第5步生成的 hello-springboot-0.0.1-SNAPSHOT.jar 可以看到反编译的内容

      image-20250303170746687

    • 实现反编译:继续点击左上角的 file > save all sources ,将其保存到相应的目录,保存的文件为⼀个压缩文件,将其解压即可

posted @ 2025-03-03 18:34  荔枝在敲诈  阅读(819)  评论(0)    收藏  举报