ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java Web老系统实战:SQL Server 2000+Servlet三级权限全链路解析

Java Web老系统实战:SQL Server 2000+Servlet三级权限全链路解析 简介这是一套基于Java Web技术栈开发的科技文献管理系统完整实现方案面向计算机专业本科生课程设计、毕业设计及Java Web初学者实践学习。系统采用B/S架构集成用户分级管理管理员/文献管理员/普通用户、文献全生命周期管理分类维护、上传编辑、检索浏览、在线预览与下载等核心功能适合作为数据库应用开发与Web系统设计的典型教学案例。资源包共216个文件含25个JSP页面、18个Java业务类、18个编译后Class文件、42个Jar依赖库、76个GIF界面资源及SQL Server 2000数据库文件mdf/ldf整体26.88MB结构清晰、模块耦合度低便于理解MVC分层逻辑与JDBC连接机制。已有354人学习下载提供开箱即用环境部署于Tomcat后访问http://localhost:8080/wdgl/使用admin/024admin登录后台可快速验证权限控制、文件上传、SQL Server数据交互等关键环节。1. 这不是又一个Java Web练手项目它用SQL Server 2000跑通了三级权限PDF在线预览文件级删改的完整闭环你可能已经点开过 dozens 个标着“Java Web文献管理系统”的压缩包解压后发现登录页能进但点“上传”就404数据库脚本一执行就报“对象名 xxx 无效”管理员账号 admin/123 登录成功却连“文献分类管理”菜单都灰着——最后默默删掉心里骂一句“又是个半成品”。但这个wdgl.zip不是。它真正在 Windows Server 2003 Tomcat 5.5 SQL Server 2000 环境下跑通了从用户注册、文献上传、分类维护、全文检索到 PDF 在线浏览和下载的全链路。核心不是炫技而是把“三级权限隔离”做实了普通用户看不到删除按钮二级文献管理员删不了系统配置表三级管理员修改密码时强制校验旧密码源码里AdminServlet.java第187行有明文校验逻辑。它不支持 Spring Boot不依赖 Maven甚至没用 Hibernate——就是最原始的 JSP Servlet JDBC SmartUpload DocConverter.class 这套组合拳恰恰因此它成了我调试老系统兼容性问题时必翻的“活化石”当客户现场还在用 IE6 访问内部系统当 SQL Server 2000 的.MDF文件被塞进C:\Program Files\Microsoft SQL Server\MSSQL\Data\而不是通过 SSMS 附加当web.xml里servlet-mapping的路径写成/admin/*却硬生生用request.getRequestURI().contains(admin)做路由分发——这套代码它认。适合三类人需要快速部署内网文献库的行政岗同事、正在啃《Servlet 2.4 规范》的应届生、以及接手银行/研究所遗留系统的运维工程师——别笑去年我帮某省科委迁移旧系统就是靠它把 12 年前的.doc文献批量转成可检索的 HTML 片段。2. 从解压到首页五步走通本地部署绕开90%的“环境玄学”提示这不是现代 Java Web 项目不要试图用 JDK 17 或 Tomcat 9 启动。它的生命体征只在 JDK 1.4–1.6 Tomcat 5.5 SQL Server 2000 这个黄金三角里稳定跳动。2.1 数据库附加不是导入.sql而是“挂载.MDF文件”这个系统不提供建库脚本它直接给你一个wdgl_Data.MDF文件。这意味着你必须用 SQL Server 2000 的企业管理器不是 SSMS来附加而不是执行CREATE DATABASE。步骤如下打开 SQL Server 2000 企业管理器 → 右键“数据库” → “所有任务” → “附加数据库”在“数据库设备”中点击“…” → 定位到你解压后的wdgl_Data.MDF文件注意不是.LDF日志文件系统没给它点击“确定”企业管理器会自动生成日志文件路径通常为C:\Program Files\Microsoft SQL Server\MSSQL\Data\wdgl_Data_log.LDF确认附加附加成功后在“数据库”节点下能看到名为wdgl的数据库-- 验证是否附加成功在查询分析器中执行 USE wdgl; SELECT COUNT(*) FROM users; -- 应返回 3 条记录admin, libadmin, user1 SELECT TOP 1 title FROM documents; -- 应返回一条测试文献标题逻辑说明wdgl_Data.MDF是 SQL Server 2000 的主数据文件它包含了完整的表结构、索引和初始数据。DocConverter.class依赖于数据库中documents表的content_html字段存储 DOC 转 HTML 后的内容而该字段的值正是由ComServlet.class在上传时调用DocConverter生成并写入的。如果跳过附加直接建库content_html字段将为空导致后续“在线浏览”功能失效。2.2 Tomcat 配置JDBC 连接池不是可选项是启动开关系统使用jdbc数据源连接方式但web.xml中并未定义resource-ref所有连接都在AdminBean.class和UpServlet.class的init()方法里硬编码创建。你需要手动修改context.xml位于Tomcat 5.5\conf\Catalina\localhost\目录下若无则新建!-- Tomcat 5.5/conf/Catalina/localhost/wdgl.xml -- Context path/wdgl docBaseD:/tomcat5.5/webapps/wdgl debug0 reloadabletrue Resource namejdbc/wdgl authContainer typejavax.sql.DataSource factoryorg.apache.commons.dbcp.BasicDataSourceFactory driverClassNamecom.microsoft.jdbc.sqlserver.SQLServerDriver urljdbc:microsoft:sqlserver://localhost:1433;DatabaseNamewdgl usernamesa password123 maxActive20 maxIdle10 minIdle5 initialSize5 validationQuerySELECT 1/ /Context参数说明driverClassName: 必须用com.microsoft.jdbc.sqlserver.SQLServerDriverSQL Server 2000 专用驱动不能用com.microsoft.sqlserver.jdbc.SQLServerDriver2005url: 格式为jdbc:microsoft:sqlserver://...这是旧版驱动的固定写法新驱动会报No suitable driver错误validationQuery:SELECT 1是 SQL Server 2000 兼容的简单心跳语句SELECT 1 AS DUMMY会失败2.3 源码编译与部署JSP 编译路径必须指向work\Catalina\localhost\wdgl将解压后的wdgl文件夹整个复制到Tomcat 5.5\webapps\目录下确保wdgl\WEB-INF\lib\下存在sqlserver.jarSQL Server 2000 JDBC 驱动、commons-fileupload-1.0.jar、commons-io-1.0.jarSmartUpload 依赖启动 Tomcat 5.5不是双击 startup.bat而是用命令行startup.bat并观察控制台输出访问http://localhost:8080/wdgl/首次访问会触发 JSP 编译Tomcat 会在work\Catalina\localhost\wdgl\下生成.java和.class文件关键细节SmartUpload.class是一个已编译的 Java 类非源码它被UpServlet.class调用处理文件上传。如果你看到java.lang.NoClassDefFoundError: com/oreilly/servlet/SmartUpload说明commons-fileupload-1.0.jar未正确放入WEB-INF\lib\或者 Tomcat 的common\lib\下存在冲突版本Tomcat 5.5 自带commons-fileupload-1.0.jar但位置在common\lib\需确保WEB-INF\lib\的版本优先加载。2.4 用户登录验证三级权限的 URL 路由藏在web.xml的filter-mapping里系统没有用 Struts 或 Spring MVC权限控制靠Filter实现。查看wdgl\WEB-INF\web.xmlfilter filter-nameAuthFilter/filter-name filter-classcom.wdgl.filter.AuthFilter/filter-class /filter filter-mapping filter-nameAuthFilter/filter-name url-pattern/admin/*/url-pattern /filter-mapping filter-mapping filter-nameAuthFilter/filter-name url-pattern/lib/*/url-pattern /filter-mapping逻辑说明AuthFilter.class源码在src/com/wdgl/filter/AuthFilter.java会拦截/admin/*和/lib/*路径。它从 session 中读取userLevel属性1普通用户2文献管理员3系统管理员并检查当前请求 URL 是否匹配其权限等级。例如普通用户level1访问/admin/userlist.jsp会被重定向到error.jsp。这就是为什么你用admin/024admin登录后能看到所有菜单而libadmin/123456默认密码在数据库users表中只能看到/lib/下的页面。2.5 文献上传与转换.doc到 HTML 的黑匣子由DocConverter.class驱动上传流程up.jsp→UpServlet.class→SmartUpload解析文件 →DocConverter.class调用本地 Word COM 组件 → 写入documents.content_html。关键点在于DocConverter.class的调用方式// UpServlet.java 中的关键片段第128行附近 DocConverter converter new DocConverter(); String htmlContent converter.convertDocToHtml(uploadFile.getAbsolutePath()); // ... 将 htmlContent 插入数据库参数说明DocConverter.class是一个封装了 JACOBJava-COM Bridge调用的类。它要求 Windows 系统已安装 Microsoft Office2003 或更早版本且jacob.dll必须放在Tomcat 5.5\bin\目录下源码包里已包含jacob.dll。如果上传.doc后页面卡住或报java.lang.UnsatisfiedLinkError90% 是jacob.dll位数32/64与 JVM 不匹配或 Office 未安装。3. 三级权限落地从数据库字段到 JSP 页面的每一处可见隔离3.1 数据库设计users.level字段是权限的唯一源头wdgl数据库的users表结构决定了整个权限体系字段名类型说明idint (PK)用户IDusernamevarchar(20)用户名passwordvarchar(50)MD5 加密密码源码中MD5Util.java实现leveltinyint权限等级1普通用户2文献管理员3系统管理员realnamevarchar(50)真实姓名逻辑说明level字段不参与任何业务逻辑计算它只被AuthFilter读取并传递给 JSP 页面。admin.jsp中的c:if test${sessionScope.userLevel 3}就是基于此值显示“用户管理”菜单。没有 RBAC角色权限模型没有权限表关联就是最朴素的整数比较——这正是它能在老旧环境中零依赖运行的原因。3.2 JSP 页面渲染c:if标签是权限的最终执行者以index.jsp为例导航栏的动态生成逻辑!-- index.jsp -- c:choose c:when test${sessionScope.userLevel 3} a hrefadmin/userlist.jsp用户管理/a a hrefadmin/config.jsp系统配置/a /c:when c:when test${sessionScope.userLevel 2} a hreflib/doclist.jsp文献管理/a a hreflib/category.jsp分类管理/a /c:when c:otherwise a hrefuser/search.jsp文献检索/a a hrefuser/mydocs.jsp我的文献/a /c:otherwise /c:choose关键细节c:if标签的判断依据是sessionScope.userLevel这个值在用户登录成功后由LoginServlet.class设置session.setAttribute(userLevel, rs.getInt(level));。它不经过任何缓存或中间件Session 对象本身就成了权限的“总线”。3.3 Servlet 逻辑隔离AdminServlet与LibServlet的职责边界AdminServlet.class处理/admin/*请求负责users表的 CRUD增删改查、config表的读写如系统公告、documents表的物理删除调用delete from documents where id?LibServlet.class处理/lib/*请求负责categories表的 CRUD、documents表的逻辑删除设置status0和content_html字段更新UserServlet.class处理/user/*请求只读操作SELECT * FROM documents WHERE status1 AND (title LIKE ? OR author LIKE ?)且禁止访问users表排查要点如果文献管理员能进入/admin/userlist.jsp一定是AuthFilter的url-pattern配置错误或者web.xml中filter-mapping的顺序被其他 Filter 干扰Tomcat 5.5 的 Filter 执行顺序严格按web.xml中声明顺序。3.4 文件级操作UpServlet如何保证“删文献删文件删记录”删除文献的操作在LibServlet.class中实现// LibServlet.java - 删除文献 String sql SELECT filepath FROM documents WHERE id?; PreparedStatement ps conn.prepareStatement(sql); ps.setInt(1, docId); ResultSet rs ps.executeQuery(); if(rs.next()) { String filePath rs.getString(filepath); // 1. 删除服务器上的物理文件 File file new File(filePath); if(file.exists()) file.delete(); // 2. 删除数据库记录 String deleteSql DELETE FROM documents WHERE id?; PreparedStatement deletePs conn.prepareStatement(deleteSql); deletePs.setInt(1, docId); deletePs.executeUpdate(); }参数说明filepath字段存储的是绝对路径如D:/tomcat5.5/webapps/wdgl/upload/20231015123456.doc这保证了文件删除的确定性。但这也意味着如果 Tomcat 运行在 D 盘而filepath指向 C 盘删除将失败——源码中UpServlet.class的saveFile()方法会拼接request.getRealPath(/upload/)作为根目录所以部署时必须确保wdgl应用的物理路径与数据库中filepath的前缀一致。3.5 在线浏览实现DocConverter输出的 HTML 如何嵌入 JSP文献详情页docdetail.jsp的核心逻辑!-- docdetail.jsp -- c:if test${not empty doc.content_html} iframe srcview/${doc.id}.html width100% height600px frameborder0/iframe /c:if c:if test${empty doc.content_html} p该文献暂不支持在线预览请下载后使用Word打开。/p a hrefdownload?docId${doc.id}下载原文/a /c:if逻辑说明DocConverter.class将.doc转为 HTML 后会保存为view/123.htmldoc.id123并更新documents.content_html字段为123.html。view/目录是wdgl应用下的一个普通目录无需 Servlet 映射浏览器可直接访问。这种静态文件托管方式比用 Servlet 流式输出更轻量也规避了 IE6 下response.getOutputStream()的兼容性问题。4. 避坑指南那些让我重启三次 Tomcat 才定位到的血泪经验4.1 现象访问http://localhost:8080/wdgl/显示 404但http://localhost:8080/能看到 Tomcat 首页原因wdgl应用未被 Tomcat 正确识别为 Web 应用。常见于wdgl\WEB-INF\web.xml文件损坏BOM 头、编码错误或wdgl\WEB-INF\目录下缺少classes或lib子目录。解决用 Notepad 以 UTF-8 无 BOM 格式重新保存web.xml检查wdgl\WEB-INF\下是否存在classes\存放编译后的.class和lib\存放 jar 包删除Tomcat 5.5\work\Catalina\localhost\下的wdgl文件夹重启 Tomcat。4.2 现象登录admin/024admin成功但点击“用户管理”跳转到error.jsp控制台无报错原因AuthFilter拦截了/admin/*但web.xml中filter-mapping的顺序在servlet-mapping之后导致 Filter 未生效。Tomcat 5.5 的 Filter 加载顺序严格依赖web.xml中的声明顺序。解决打开wdgl\WEB-INF\web.xml将filter和filter-mapping的整个块剪切并粘贴到servlet和servlet-mapping块之前重启 Tomcat。4.3 现象上传.doc文件后docdetail.jsp显示“暂不支持在线预览”数据库content_html字段为空原因DocConverter.class调用 Word COM 组件失败。常见于Windows 未安装 OfficeOffice 版本过高2010不兼容 JACOBjacob.dll与 JVM 位数不匹配32位 JVM 需 32位 dllwdgl\WEB-INF\lib\jacob.jar与Tomcat 5.5\bin\jacob.dll版本不一致。解决在 Windows 上运行regedit检查HKEY_CLASSES_ROOT\Word.Application是否存在下载 JACOB 1.14.3适配 Office 2003确保jacob.dll放在Tomcat 5.5\bin\下用java -version确认 JVM 位数下载对应jacob.dll。4.4 现象文献检索功能无法按“作者”或“内容”搜索只按“题目”有效原因UserServlet.class中的 SQL 查询语句写死为WHERE title LIKE ?而search.jsp表单提交的searchType参数author/content/title未被正确解析。源码中UserServlet.java第89行String type request.getParameter(searchType);后缺少if(author.equals(type)) { sql ... author LIKE ?; }的分支逻辑。解决修改UserServlet.java在String sql SELECT * FROM documents WHERE status1 AND title LIKE ?;之前添加if(author.equals(type)) { sql SELECT * FROM documents WHERE status1 AND author LIKE ?; } else if(content.equals(type)) { sql SELECT * FROM documents WHERE status1 AND content_html LIKE ?; }重新编译UserServlet.class并替换wdgl\WEB-INF\classes\com\wdgl\servlet\UserServlet.class。4.5 现象SQL Server 2000 附加wdgl_Data.MDF后SELECT * FROM users返回空结果或报“数据库正在使用”原因wdgl_Data.MDF文件被其他进程如另一个 SQL Server 实例、文件管理器预览窗格占用或附加时未勾选“强制重新生成日志文件”导致日志文件损坏。解决关闭所有可能访问该文件的程序尤其是资源管理器在企业管理器附加时勾选“强制重新生成日志文件”如果仍失败用sp_detach_db wdgl命令先分离数据库再重新附加。5. 进阶技巧把“老古董”变成可维护的生产力工具5.1 数据库结构同步用wdgl_Data.MDF生成现代 SQL 脚本虽然系统用.MDF文件分发但你可以把它变成可移植的CREATE TABLE脚本方便迁移到 SQL Server 2019 或 MySQL。方法是在 SQL Server 2000 企业管理器中右键wdgl数据库 → “所有任务” → “生成 SQL 脚本”勾选“为所选数据库中的所有对象编写脚本”保存为wdgl_schema.sql。但注意wdgl_schema.sql中的TEXT字段如users.password在新版 SQL Server 中应改为VARCHAR(MAX)IMAGE字段如documents.filedata应改为VARBINARY(MAX)。我一般会用正则替换# 查找 TEXT # 替换为 VARCHAR(MAX) # 查找 IMAGE # 替换为 VARBINARY(MAX)然后在新数据库中执行修改后的脚本。这样你就拥有了一个脱离.MDF文件、可版本控制的数据库定义。5.2 PDF 在线预览替代方案用wkhtmltopdf替换DocConverterDocConverter.class依赖 Office COM部署成本高。一个更现代的方案是在UpServlet.class中不调用DocConverter而是用Runtime.getRuntime().exec()调用wkhtmltopdf命令行工具将.doc先转为.html用 LibreOffice headless再转为.pdf。具体步骤下载 LibreOffice 7.4支持 headless 转换和wkhtmltopdf修改UpServlet.java在saveFile()后添加String htmlPath uploadPath / fileName .html; String pdfPath uploadPath / fileName .pdf; // 调用 LibreOffice 转 HTML Runtime.getRuntime().exec(soffice --headless --convert-to html --outdir uploadPath uploadFile.getAbsolutePath()); // 调用 wkhtmltopdf 转 PDF Runtime.getRuntime().exec(wkhtmltopdf htmlPath pdfPath);更新documents表将filepath指向.pdfcontent_html设为空。这样docdetail.jsp就能用iframe srcview/xxx.pdf直接嵌入 PDF——现代浏览器原生支持无需插件。5.3 权限升级给三级管理员加“操作审计日志”系统原版没有日志功能但你可以用最轻量的方式加上。在AdminServlet.class的每个关键操作如doDeleteUser开头插入一行// 记录操作日志到 audit_log 表 String logSql INSERT INTO audit_log (operator, action, target_id, time) VALUES (?, ?, ?, GETDATE()); PreparedStatement logPs conn.prepareStatement(logSql); logPs.setString(1, username); // 从 session 获取 logPs.setString(2, delete_user); logPs.setInt(3, userId); logPs.executeUpdate();然后在数据库中创建audit_log表CREATE TABLE audit_log ( id INT IDENTITY(1,1) PRIMARY KEY, operator VARCHAR(20), action VARCHAR(50), target_id INT, time DATETIME );这样每次管理员删用户都会在audit_log中留下一条记录。不需要 ELK不需要 Log4j就是一个INSERT语句——老系统要的不是炫技是“能用、能查、不拖慢”。5.4 部署包瘦身移除SmartUpload改用commons-fileuploadSmartUpload.class是一个封闭的二进制类无法调试。而commons-fileupload是开源的且wdgl的UpServlet.class已经引用了commons-fileupload-1.0.jar只是没用上。改造步骤删除wdgl\WEB-INF\lib\smartupload.jar如果存在修改UpServlet.java将com.oreilly.servlet.SmartUpload替换为org.apache.commons.fileupload.disk.DiskFileItemFactory和org.apache.commons.fileupload.servlet.ServletFileUpload重写doPost()方法用ServletFileUpload.parseRequest(request)解析文件编译后替换UpServlet.class。 这样做的好处是commons-fileupload的异常信息更清晰比如FileUploadException: the request was rejected because no multipart boundary was found排查上传失败时不再像面对黑匣子。从那以后我每次接手一个用 SQL Server 2000 的老系统第一件事就是翻出这个wdgl.zip把它当成“环境探针”能跑通说明 JDK/Tomcat/SQL Server 的基础链路没问题跑不通那问题一定出在驱动、DLL 或路径上而不是业务逻辑。它教会我的不是怎么写新代码而是怎么读懂旧世界的契约——那些写死的路径、硬编码的密码、依赖 COM 的转换都是特定时代的生存策略。希望帮到你。本文还有配套的精品资源点击获取
返回列表