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

校园选举投票系统认证异常求助:登录后跳转问题

校园选举投票软件认证问题解决方案

问题根源分析

登录成功后进入admin.html却被自动重定向,核心原因是前端JS调用的/checkAuthentication接口返回了未认证状态,而实际会话中authenticated属性已正确设置。常见诱因包括:

  • 后端认证接口逻辑错误,误判会话状态
  • 前端请求未携带Session Cookie,导致后端无法识别已登录会话
  • 路由映射配置错误,接口未正确关联到AuthServlet
  • 登录跳转方式不当,会话属性未及时生效

分步修复方案

1. 修正AuthServlet的认证判断逻辑

确保/checkAuthentication接口正确校验会话状态,避免空指针和逻辑反转:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 不创建新会话,仅获取已存在的会话
    HttpSession session = request.getSession(false);
    boolean isAuthenticated = session != null && Boolean.TRUE.equals(session.getAttribute("authenticated"));
    
    response.setContentType("application/json");
    PrintWriter out = response.getWriter();
    out.write("{\"authenticated\": " + isAuthenticated + "}");
    out.flush();
}

2. 修复前端JS的认证请求

确保请求携带Session Cookie,避免后端无法识别会话:

window.addEventListener('load', () => {
    fetch('/你的应用上下文/checkAuthentication', {
        credentials: 'include' // 强制携带同域Cookie
    })
    .then(res => res.json())
    .then(data => {
        if (!data.authenticated) {
            window.location.href = 'index.html';
        }
    })
    .catch(() => window.location.href = 'index.html');
});

如果使用XMLHttpRequest,需设置withCredentials = true:

window.addEventListener('load', () => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', '/你的应用上下文/checkAuthentication', true);
    xhr.withCredentials = true;
    xhr.onreadystatechange = () => {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                const data = JSON.parse(xhr.responseText);
                if (!data.authenticated) window.location.href = 'index.html';
            } else {
                window.location.href = 'index.html';
            }
        }
    };
    xhr.send();
});

注意替换/你的应用上下文为实际项目的上下文路径,根路径直接用/checkAuthentication。

3. 校验web.xml的路由映射

确保AuthServlet同时关联/checkAuthentication接口和/admin.html拦截:

<servlet>
    <servlet-name>AuthServlet</servlet-name>
    <servlet-class>你的包路径.AuthServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>AuthServlet</servlet-name>
    <url-pattern>/checkAuthentication</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>AuthServlet</servlet-name>
    <url-pattern>/admin.html</url-pattern>
</servlet-mapping>

同时确认LoginServlet的映射正确:

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>你的包路径.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

4. 优化LoginServlet的跳转逻辑

登录成功后优先使用服务器端转发,确保会话属性立即生效:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    
    if ("gr".equals(username) && "password".equals(password)) {
        HttpSession session = request.getSession();
        session.setAttribute("authenticated", true);
        // 服务器端转发,会话数据直接生效
        request.getRequestDispatcher("admin.html").forward(request, response);
    } else {
        response.sendRedirect("index.html");
    }
}

若使用客户端跳转(sendRedirect),需拼接上下文路径:response.sendRedirect(request.getContextPath() + "/admin.html")。

5. 双重保障:禁用admin.html直接访问

在web.xml中添加安全约束,配合AuthServlet拦截未认证请求:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Admin Pages</web-resource-name>
        <url-pattern>/admin.html</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

内容的提问来源于stack exchange,提问作者Pharaoh_2398

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:11:04