我有两个模块。其中包含我的前端的是我的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文件夹中。index.html
页?答案 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 时。