我正在开发一个应用,该应用的前端为Angle 6,后端为Spring Boot。在实施用户身份验证模块的过程中,我想相应地登录后重定向到学生和教职工的家。
但是,我无法从Spring Boot重定向页面。使用Redirect to an external URL from controller action in Spring MVC这个解决方案,我得到了CORS错误: “在飞行前响应中,Access-Control-Allow-Headers不允许请求标头字段的内容类型。”
或者,如果还有另一种方法可以完成此任务?
AuthenticationController.java
package sgsits.cse.dis.user.controller;
@CrossOrigin(origins = "*") // enables cross origin request
@RestController
@RequestMapping(value = "/dis")
@Api(value = "Authentication Resource")
public class AuthenticationController {
@Autowired
StudentRepository studRepo;
@Autowired
StaffRepository staffRepo;
@Autowired
EmailController email;
String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
@ApiOperation(value = "login", response = Object.class, httpMethod = "POST", produces = "application/json")
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestBody Authentication auth, HttpServletResponse httpServletResponse) {
Optional<StaffProfile> staff = staffRepo.findByEmail(auth.getUsername());
if (staff.isPresent()) {
String md5_pass = MD5.getHash(auth.getPassword());
if (staff.get().getPassword().equals(md5_pass)) {
// set session
// update last login
return "forward:/localhost:4200/staff";
} else
return "You have entered incorrect password";
} else {
Optional<StudentProfile> student = studRepo.findByEnrollmentId(auth.getUsername());
if (student.isPresent()) {
String md5_pass = MD5.getHash(auth.getPassword());
if (student.get().getPassword().equals(md5_pass)) {
// set session
// update last login
httpServletResponse.setHeader("Location", "http://localhost:4200/reset-password");
httpServletResponse.setStatus(302);
return "redirect:localhost:4200/student";
} else
return "You have entered incorrect password";
} else {
return "You are not registered with the system. Please signup first";
}
}
}
}
答案 0 :(得分:0)
请勿向控制器添加@CrossOrigin(origins = "*")
注释。
假设您的api在8080上运行,而您的角度代码在4200上运行。如果为true;
创建一个名为proxy.conf.json的文件
{
"/api/": {
"target": "http://localhost:8080/",
"secure": false,
"changeOrigin": true
}
使用此命令启动角度应用
ng serve --proxy-config proxy.conf.json
使用此配置,当您调用localhost:4200 / api时,它将调用8080,并且不会出现任何CORS错误
答案 1 :(得分:0)
为什么您不返回正确的API响应和代码,并且根据响应和代码,您可以在前端重定向。
它使您的API完全安全。我希望这会有所帮助。
答案 2 :(得分:0)
我观察到,当您从Spring Boot重定向到Angular页面时,错误“预检响应中Access-Control-Allow-Headers不允许请求标头字段content-type”表示 Angular node.js服务器在Angular应用配置中的标头Access-Control-Allow-Headers 中未检测到字段内容类型。这里的要点是后端服务器和客户端应用程序的角色在此重定向中有点相反。
为解决此问题,我将通过以下方式将内容类型字段添加到 response 标头Access-Control-Allow-Headers:
1. create file proxy.config.js just below the package.json file in your Angular project with this code:
module.exports = {
"/": {
"secure": false,
"bypass": (req, res, proxyOptions) => {
res.setHeader('Access-Control-Allow-Headers', "Content-Type");
}
}
};
并通过添加以下行来修改angular.json文件:
"proxyConfig": "proxy.config.js"
到此位置:
projects >> client >> architect >> serve >> options
此解决方案适用于我的情况。请注意,字段名称的首字母大写很重要。