You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:11:23