Tomcat:401错误重定向后如何修改显示的URL地址
解决401重定向后URL不更新的问题
你遇到的问题本质是服务器内部转发(Forward)和客户端重定向(Redirect)的区别:web.xml里直接配置<error-page>是服务器内部转发,浏览器完全不知道这个跳转,所以地址栏会保留原来的请求URL。要让地址栏变成localhost:8080/,必须触发客户端重定向,下面给你几种可行的方案:
方案1:自定义错误处理Servlet
先写一个专门处理错误的Servlet,在里面对401状态做客户端重定向:
@WebServlet("/error-handler") public class ErrorHandlerServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取错误状态码 Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode != null && statusCode == HttpServletResponse.SC_UNAUTHORIZED) { // 客户端重定向到根路径,用getContextPath避免上下文路径问题 response.sendRedirect(request.getContextPath() + "/"); } // 其他错误状态可以按需扩展处理逻辑 } }
然后修改web.xml的错误页配置,指向这个Servlet:
<error-page> <error-code>401</error-code> <location>/error-handler</location> </error-page>
方案2:用Filter拦截401响应
通过过滤器拦截所有请求,在响应返回前检查状态码,若为401则触发重定向:
@WebFilter("/*") public class AuthRedirectFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; HttpServletRequest httpRequest = (HttpServletRequest) request; // 先让请求正常处理 chain.doFilter(request, response); // 检查响应状态 if (httpResponse.getStatus() == HttpServletResponse.SC_UNAUTHORIZED) { // 重置响应,避免之前的错误内容被输出 httpResponse.reset(); // 重定向到根路径 httpResponse.sendRedirect(httpRequest.getContextPath() + "/"); } } // 其他Filter接口方法(init/destroy)可以留空或按需实现 }
方案3:Spring MVC项目用全局异常处理
如果你的项目是Spring MVC,可以用@ControllerAdvice全局捕获权限异常,直接返回重定向指令:
@ControllerAdvice public class GlobalAuthExceptionHandler { // 捕获Spring Security的AccessDeniedException(对应401/403) @ExceptionHandler(AccessDeniedException.class) public String handleUnauthorized() { // redirect前缀会触发客户端重定向 return "redirect:/"; } }
关键提醒
- 一定要用
response.sendRedirect()或者Spring的redirect:/语法,这才是客户端重定向,会让浏览器发起新请求,地址栏随之更新。 - 用
request.getContextPath()拼接路径,避免项目部署在非根上下文时出现路径错误。
内容的提问来源于stack exchange,提问作者Shashank Raju
相关产品推荐
相关产品推荐

