关于@WebServlet(“LoginServlet“)404 报错的解决办法 “请求的资源[/test/LoginServlet] 不可用”

本文详细阐述了如何解决在使用@WebServlet快捷配置时遇到的404错误,涉及版本检查、web.xml配置调整和Tomcat重启技巧,适合Tomcat 8.5及以上版本用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于@WebServlet(“LoginServlet”)404 报错的解决办法 “请求的资源[/test/LoginServlet] 不可用”


*一切事物的开头总是困难这句话,在任何一种科学上都是适用的。 *

——马克思


一个困扰了我n天的问题,终于终于还是解决了!

通过 @WebServlet ("loginServlet "; 这种形式可以快捷完成 Web.xml的配置工作。那如果出现以下报错该如何解决呢?

这里整理了全网最全的几个解决办法,方便逐一排查!(啊,这是经历多少血和泪才会查到那么多啊!)
在这里插入图片描述


1、先检查版本

先检查两个东西是否具备@WebServlet这个快捷方式!(啊我的就是这个问题)

一言以蔽之,Tomcat 7.0 之后,Servlet3.0 之后的版本,才支持!

(啊我的 Tomcat 是 7.0 所以不支持,重新配置为 8.5 后成功)

Servlet 版本查看和修改方法:在 Web-INF 的 lib 下的 web.xml 中查看。创建 Servlet 模板的时候记得选上 3.0 版本!

2、在 web.xml 中,先查看版本是否是 version=“3.0”。

再看看在<web-app metadata-complete=false这个标签的属性里是不是为 false,一般是没有这个属性(默认为 false)。

3、Project 栏选中 Build Automatically,然后重启 Tomcat

来源博客
https://blog.csdn.net/qq_40210633/article/details/85939191

总结

老师说:解决的问题越多懂得越多。

但我哭得好大声!


看完不点赞心会痛的!

看完不点赞心会痛的!

看完不点赞心会痛的!

👇 👇 👇 👇 👇 👇

<think>好的,我现在需要帮助用户重构他们提供的`LoginServlet`代码,特别是替换掉对`sun.plugin.com.Dispatcher`的依赖。首先,我得仔细看看用户提供的代码。他们有一个`LoginServlet`类,使用`@WebServlet`注解映射到"/login",并重写了`doGet`和`doPost`方法,其中`doPost`方法使用`RequestDispatcher`转发到"login.jsp"。过代码中导入了`sun.plugin.com.Dispatcher`,但看起来并没有实际使用这个类。这可能是一个遗留的依赖,需要被移除。 首先,我需要确认用户为什么提到要重构与`sun.plugin.com.Dispatcher`相关的代码,但在提供的示例中并没有使用到它。这可能意味着用户可能在代码的其他部分使用了这个类,或者这是一个残留的导入语句。在这种情况下,重构的重点应该是移除必要的依赖,并确保代码依赖于推荐使用的内部API,比如`sun`包下的类,因为这些在Java中是建议使用的,可能导致兼容性问题。 接下来,我需要分析现有的`LoginServlet`结构。这个Servlet处理GET和POST请求,POST方法只是转发到JSP页面。这部分看起来简单,但可能需要考虑安全性和现代最佳实践,比如防止跨站请求伪造(CSRF),使用HTTPS,输入验证等。过用户的重构请求主要集中在替换`Dispatcher`,所以可能需要先处理这部分。 然后,我需要考虑如何替换`sun.plugin.com.Dispatcher`。根据用户之前提供的重构指南,他们建议使用现代的替代方案,比如`Web Worker`、`Proxy`对象或自定义事件。过在这个Servlet示例中,可能并直接需要这些技术,因为`Dispatcher`可能用于同的上下文,比如客户端与Applet的通信。如果`Dispatcher`在代码的其他部分被使用,比如处理请求或分发事件,那么需要找到合适的替代方案。 由于在提供的代码中没有实际使用`Dispatcher`,可能只需要删除导入语句,并检查项目中的其他位置是否有引用。如果有,需要逐一替换。例如,如果`Dispatcher`用于处理请求分发,可能需要替换为Servlet API中的`RequestDispatcher`或者使用其他框架如Spring MVC的控制器。 另外,需要考虑代码的结构是否符合MVC模式,是否有业务逻辑与Servlet耦合的问题。重构可能涉及将业务逻辑分离到服务层,使用依赖注入等。例如,将`MessageBus`接口注入到业务逻辑中,而是直接调用`Dispatcher`。 在代码示例中,`doPost`方法直接转发到JSP,这可能符合MVC,但如果以后需要扩展,比如添加认证逻辑,可能需要将处理逻辑移到服务类中,Servlet只负责请求处理和转发。例如,处理用户登录时,调用认证服务,根据结果转发到同的页面。 测试也是一个重要方面。确保在重构后,原有的功能仍然正常工作,可能需要编写单元测试和集成测试。例如,使用JUnit测试Servlet请求处理,模拟`HttpServletRequest`和`HttpServletResponse`,验证转发是否正确。 最后,工具链的使用,比如静态分析工具PMD或Checkstyle,可以帮助检测推荐的API使用,确保代码符合规范。持续集成工具如SonarQube可以监控代码质量,确保重构后的代码符合质量标准。 总结来说,针对用户提供的代码,重构步骤可能包括:移除未使用的`Dispatcher`导入,检查并替换项目中其他`Dispatcher`的使用,优化Servlet结构,引入服务层,增加测试,以及应用代码质量工具。同时,需要确保遵循Java Servlet的最佳实践,避免使用内部API,提高代码的可维护性和安全性。</think>以下是针对该`LoginServlet`的重构方案,分步骤进行说明: --- ### **一、问题分析** #### 1. **现存问题** - **风险依赖**:`sun.plugin.com.Dispatcher`是Java插件内部API(已过时) - **代码冗余**:`doGet`直接调用`doPost`但无额外逻辑 - **安全性**:未处理请求参数校验和CSRF防护 - **扩展性**:视图跳转硬编码在Servlet中 --- ### **二、分步骤重构** #### **第1步:移除危险依赖** ```diff - import sun.plugin.com.Dispatcher; // 删除废弃依赖 ``` #### **第2步:解耦视图导航** **创建视图解析器接口**: ```java // 新增接口 public interface ViewResolver { void resolveView(String viewName, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; } ``` **实现类**: ```java // JSP视图解析器 public class JspViewResolver implements ViewResolver { private final String prefix = "/WEB-INF/views/"; private final String suffix = ".jsp"; @Override public void resolveView(String viewName, HttpServletRequest req, HttpServletResponse resp) { req.getRequestDispatcher(prefix + viewName + suffix) .forward(req, resp); } } ``` #### **第3步:重构Servlet** ```java @WebServlet(urlPatterns = "/login") public class LoginServlet extends HttpServlet { private ViewResolver viewResolver; // 依赖抽象 @Override public void init() { this.viewResolver = new JspViewResolver(); // 可替换实现 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) { // 参数校验逻辑(示例) String username = req.getParameter("username"); if (username == null || username.isBlank()) { sendError(resp, "用户名能为空"); return; } viewResolver.resolveView("login", req, resp); // 统一视图解析 } private void sendError(HttpServletResponse resp, String msg) { resp.setStatus(HttpServletResponse.SC_BAD_REQUEST); resp.getWriter().print(msg); } } ``` --- ### **三、安全增强** #### **1. 添加CSRF防护** ```java // 在doPost方法开头添加 String sessionToken = (String) req.getSession().getAttribute("CSRF_TOKEN"); String requestToken = req.getParameter("csrfToken"); if (!Objects.equals(sessionToken, requestToken)) { resp.sendError(HttpServletResponse.SC_FORBIDDEN, "非法请求"); return; } ``` #### **2. 参数过滤** ```java // 使用OWASP ESAPI处理XSS import org.owasp.esapi.ESAPI; String safeUsername = ESAPI.encoder().encodeForHTML( req.getParameter("username") ); ``` --- ### **四、优化建议** #### **1. 配置化改造** 在`web.xml`中添加视图配置: ```xml <context-param> <param-name>viewPrefix</param-name> <param-value>/WEB-INF/views/</param-value> </context-param> ``` #### **2. 使用Filter解耦** ```java // 创建全局过滤器 @WebFilter("/*") public class SecurityFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { // 统一处理CSRF、XSS等安全逻辑 chain.doFilter(new XssRequestWrapper((HttpServletRequest) req), res); } } ``` --- ### **五、重构前后对比** | 维度 | 重构前 | 重构后 | |------------|--------------------------|----------------------------------| | 依赖管理 | 使用sun.*内部包 | 完全移除危险依赖 | | 可测试性 | 难以Mock Dispatcher | 通过ViewResolver接口可轻松Mock | | 安全防护 | 无任何防护 | CSRF校验+XSS过滤 | | 扩展能力 | 硬编码跳转路径 | 支持多种视图技术(JSP/Thymeleaf)| --- ### **六、验证方法** 1. **单元测试**: ```java @Test void testViewResolver() throws Exception { MockHttpServletRequest req = new MockHttpServletRequest(); MockHttpServletResponse resp = new MockHttpServletResponse(); new JspViewResolver().resolveView("login", req, resp); assertEquals("/WEB-INF/views/login.jsp", req.getForwardedUrl()); } ``` 2. **渗透测试**: ```bash # 使用OWASP ZAP进行安全扫描 zap-cli quick-scan -s xss,sqli -r http://localhost:8080/login ``` --- 通过上述改造,代码将具备: 1. 符合Java EE规范的安全访问控制 2. 视图层与业务逻辑解耦 3. 防御常见Web攻击的能力 4. 可扩展的架构设计 建议进一步使用Spring MVC等现代框架进行深度重构。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值