当前位置: 首页 > 知识库问答 >
问题:

Spring Security:在401情况下重定向到单页应用程序

董光霁
2023-03-14

当我在浏览器中键入React应用程序的任何路径时,例如:http://localhost/login,请求击中我的服务器,我的服务器以401 Unauthorized响应。

当请求不是授权的后端api时,我希望在react路由中处理请求。

网络安全配置。爪哇:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            ...
            .formLogin()
                .disable()
            .authorizeRequests()
                .antMatchers(
                    "/error",
                    "/",
                    "/favicon.ico",
                    "/static/**",
                    "/api/auth/**",
                    "/api/oauth2/**",
                    "/api/courses/**",
                    "/api/stripe/**",
                    "/api/lesson/content")
                    .permitAll()
                .anyRequest()
                    .authenticated()
                .and()
            ...
            .exceptionHandling()
                .authenticationEntryPoint(new RestAuthenticationEntryPoint())
                .and();

    http.addFilterBefore(tokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}

重新验证入口点。爪哇:

public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest httpServletRequest,
                         HttpServletResponse httpServletResponse,
                         AuthenticationException e) throws IOException, ServletException {
        httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED,
                e.getLocalizedMessage());
    }
}

是否有办法将请求转发到索引。重新验证EntryPoint中的html?

共有2个答案

柴霖
2023-03-14

我决定从RestAuthenticationEntryPoint抛出404 Not Found exception,因为我认为它比401 Unhorized更符合这个用例:

    @Override
    public void commence(HttpServletRequest httpServletRequest,
                         HttpServletResponse httpServletResponse,
                         AuthenticationException e) throws IOException, ServletException {
        httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND,
                e.getLocalizedMessage());
    }

并将未找到的异常重定向到前端:

    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> containerCustomizer() {
        return container -> {
            container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
                    "/notFound"));
        };
    }
@Controller
public class CustomErrorController {

    @ResponseStatus(HttpStatus.OK)
    @RequestMapping(value = "/notFound")
    public String error() {
        return "forward:/index.html";
    }

}

这种方法的缺点是,我不能从任何控制器扔404,因为它不会返回到前端,但我可以忍受它。

费星晖
2023-03-14

你可以只处理一个401内反应:

axios.post('http://localhost:8080/login', data)
    .then(resp => ...)
    .catch(e => {
        if (e.response && e.response.status===401) 
            history.push('/error');
    });

或者您可以修改您的身份验证处理程序

    @Override
    public void commence(HttpServletRequest httpServletRequest,
                         HttpServletResponse httpServletResponse,
                         AuthenticationException e) throws IOException, ServletException {
        httpServletResponse.sendRedirect("http://localhost:3000/error");
    }
 类似资料:
  • 我想配置我的Spring Boot应用程序重定向任何404未找到请求到我的单页应用程序。 例如,如果我调用的,它应该重定向到。 问题是我有一个单页react应用程序,它在根路径中运行。所以spring应该重定向到,然后转发到(以保持路由)。

  • 我已经在selenium ide中录制了脚本,它可以很好地使用它。我有一个登录表单,成功登录后应该重定向到仪表板。但当我运行Selenium RC时,它不会在clickAndWait之后重定向到仪表板。Chrome说页面不可用,但当我重新加载页面时,它正在工作。帮助我。 Selenium RC:Selenium-server-standalone-2.34.0 Selenium版本:Seleniu

  • 我有一个Spring Boot应用程序,它可以根据特定条件将外部JAR文件复制到文件夹中。这些JAR可以包含许多Spring组件(即用注释或元注释的类),Spring应用程序应该能够扫描和实例化这些bean。根据某些条件,是否可以动态加载JAR文件的内容,并使它们可用于Spring应用程序上下文?我充分意识到这对安全的影响。 我已经阅读了Spring为其可执行JAR格式提供的不同类型的和,但是看起

  • 问题内容: 我想配置我的Spring Boot应用程序以将任何404未找到的请求重定向到我的单页应用程序。 例如,如果我正在呼叫不存在的呼叫,则应将其重定向到。 问题是我只有一个页面react应用程序,它在根路径下运行。因此,spring应该重定向到,然后转发到(以保持路由)。 问题答案: 这应该可以解决问题:为404添加一个错误页面,该页面路由到,然后将其转发到您的SPA(假设该条目位于):

  • 如果会话已过期,则自定义筛选器将用户从窗体身份验证中注销,并将用户重定向到登录页。我也知道,当用户访问授权内容时,授权失败,同样的操作流将发生。 在这种情况下,会话或身份验证超时会产生相同的效果(用户被从表单auth中签名并重定向到登录页面),主要关注的是超时(会话)大于还是小于超时(身份验证)?

  • 我正在使用Asgard CMS,这是一个基于Laravel 5.1构建的模块化CMS,并且在我创建的特定模块中面临上述问题。 整个站点都有很多post请求和重定向,这很好,但是当涉及到配置文件模块时,我遇到了这个问题。 我将一个编辑请求发布到一个路由,在完成一些工作后,我重定向回路由。当我重定向时,它会显示一个空白页面,上面写着“重定向到”http://www...“首先写入,然后在2-3秒后重定