如何从Spring控制器重定向到React页面

时间:2019-08-07 13:30:11

标签: spring reactjs

我有两个模块。其中包含我的前端的是我的React应用程序。还有一个包含我的后端和我的Spring东西。我想在我的Spring应用程序中访问一个控制器,该控制器会将我重定向到我的React应用程序。

  • 我需要返回Wait Until Element Is Visible xpath://td[contains(.,'AutomatedSchedule')]/preceding-sibling::td[1]/input[@type='checkbox'] 10 Click Element xpath://td[contains(.,'AutomatedSchedule')]/preceding-sibling::td[1]/input[@type='checkbox'] 页吗?我尝试过但失败了 可能是因为index.html位于不同的模块中,而不是 在我的Spring模块的resources / static文件夹中。
  • 使用React时,访问localhost:3000是否返回 index.html页?
  • 如果我想从我的spring控制器重定向到localhost:3000 / MainPage,我该怎么做? React路由器和交换机已经设置。

3 个答案:

答案 0 :(得分:0)

您只需通过从Spring控制器返回重定向即可解决此问题。像这样:

@RequestMapping(value = "/path", method = RequestMethod.GET)
public void handleGet(HttpServletResponse response) {
    response.setHeader("Location", "localhost:3000/MainPage");
    response.setStatus(302);
}

或者,如果您想在控制器中使用ResponseEntity:

@RequestMapping(value = "/path", method = RequestMethod.GET)
public ResponseEntity handleGet(HttpServletResponse response) {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Location", "localhost:3000/MainPage");    
    return new ResponseEntity(headers, HttpStatus.FOUND);
}

确实有多种方法可以实现,但是这些选项都应该起作用。

答案 1 :(得分:0)

您的react应用是一堆javascript / css / images文件,当下载到您的浏览器中时,它将运行并调用Spring Boot中编写的API后端(这显然需要启用CORS)。您的后端Spring Boot应用程序通常应该响应json内容,因此除非您想通过POSTMAN之类的工具测试GET API或API测试,否则通过浏览器直接访问后端API没有多大意义。请记住,实际上重定向API调用是没有意义的-它们应该只返回json。但是,如果您的目标是确保任何通过浏览器直接访问API的人都应重定向到React App,那么您可以按照@Greenbones的指示进行操作。

答案 2 :(得分:0)

如何从 React 包位置获取 index.html:

您可以将 application.properties 中的 resource.location 设置为您想要的任何内容。为了测试目的,我将它设置为我的 React 项目的构建文件夹。然后我只有 npm run build 并且新的更改是可见的。

@Configuration
@EnableWebMvc
@Slf4j
public class WebConfig implements WebMvcConfigurer {

    @Value("${resource.location:}")
    String resourceLocation;
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        if (!resourceLocation.isEmpty()) {
            log.info("static data path 'file:" + resourceLocation + "/static/'");
            registry.addResourceHandler("/static/**")
                    .addResourceLocations("file:" + resourceLocation + "/static/");
            registry.addResourceHandler("/*.js")
                    .addResourceLocations("file:" + resourceLocation + "/");
            registry.addResourceHandler("/*.json")
                    .addResourceLocations("file:" + resourceLocation + "/");
            registry.addResourceHandler("/*.ico")
                    .addResourceLocations("file:" + resourceLocation);
            registry.addResourceHandler("/index.html", "/")
                    .addResourceLocations("file:" + resourceLocation + "/index.html");
        }
    }

如何从 spring 重定向到反应路径:

我创建了 errorHandler 以便我捕获所有未处理的路径,然后我返回带有参数路径的 index.html。

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
@Slf4j
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
    log.info("no handler found for " + ex.getRequestURL());
    headers.add("location", "index.html?path="+ex.getRequestURL());
    return new ResponseEntity<>(null, headers, HttpStatus.SEE_OTHER);
}

}

在 index.html 页面上的反应端,我获取路径并将其作为道具发送到 NavigationBar

let path = window.location.search
console.log(path)
let pathMatch = path.match("(path=)(\\S*?)(&|$)")
if (pathMatch) {
  path = pathMatch[2]
}
ReactDOM.render(
  < React.StrictMode >
    <BrowserRouter>
      <NavigationBar path={path} />
    </BrowserRouter>
  </React.StrictMode >,

  document.getElementById('root')
);

然后在 NavigationBar 类中,如果 prop.path!==undefined,我将 redirectToPath 的构造函数状态中的状态设置为 true。

在渲染方法中,如果需要,我只调用一次重定向:

render() {
        if (this.state.redirectToPath) {
            this.setState({ redirectToPath: false });
            return (<Redirect to={this.props.path}/>)
        }
return ( regular render....)

所以当我想从 spring 应用程序重定向到 localhost/reactModule 时。

  1. 重定向到 localhost/reactModule
  2. 错误处理程序捕获无处理程序异常并重定向到 localhost/index.html?path=reactModule
  3. index.html 获取路径并将其作为属性添加到其子项
  4. 如果路径存在,子元素会正确重定向