Servlet处理非预期请求——WebSphere应用根路径Servlet配置问题
看起来你遇到了WebSphere和其他Servlet容器(比如Tomcat)在URL模式匹配上的行为差异问题,我来帮你梳理下原因和解决办法:
问题根源
在WebSphere Application Server中,""(空字符串)这个URL模式被当作默认Servlet使用——它会处理所有没有被其他更具体的Servlet映射匹配到的请求。这和Tomcat等容器的逻辑不一样,Tomcat里空字符串仅匹配应用根路径的请求,这就是为什么你的Servlet会处理很多不该它管的请求。
解决方案
方案1:修正URL映射(最推荐)
直接把Servlet的URL模式改成只保留"/",去掉空字符串:
@WebServlet(urlPatterns = {"/"}) public class MainPageController extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getServletContext().getRequestDispatcher("/index.jsp").forward(req, resp); } }
这样配置后,你的Servlet只会匹配应用根路径的请求(也就是http://localhost:8888/myapp和http://localhost:8888/myapp/,前者会被WebSphere自动重定向到带斜杠的路径),不会再拦截其他路径的请求。
如果你的WebSphere配置了默认欢迎页面(比如index.jsp),可能需要调整下优先级:可以在web.xml里明确指定欢迎页面,并确保你的Servlet映射优先级更高,或者直接移除默认欢迎页面的配置,让自定义Servlet全权处理根路径请求。
方案2:通过代码逻辑过滤请求
如果你因为某些特殊需求必须保留空字符串的映射,可以在Servlet的处理方法里先判断请求路径,只处理根路径的请求:
@WebServlet(urlPatterns = {"", "/"}) public class MainPageController extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String requestURI = req.getRequestURI(); String contextPath = req.getContextPath(); // 只处理根路径请求(两种形式:/myapp 或 /myapp/) if (requestURI.equals(contextPath) || requestURI.equals(contextPath + "/")) { req.getServletContext().getRequestDispatcher("/index.jsp").forward(req, resp); } else { // 非根路径请求:要么交给其他处理器,要么返回404 resp.sendError(HttpServletResponse.SC_NOT_FOUND); // 或者使用 req.getRequestDispatcher("/对应路径").forward(req, resp); 转发给合适的Servlet } } }
方案3:直接用欢迎页面配置(无需自定义Servlet)
如果你的需求只是让根路径返回index.jsp,其实完全不需要写Servlet——直接在web.xml里配置欢迎页面即可:
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
WebSphere的内置欢迎页面Servlet会自动处理根路径请求,返回指定的页面,简单又高效。
内容的提问来源于stack exchange,提问作者ikos23

