我的 Controller 中有两种映射方法。一个正在重定向到另一个。 在重定向之前,我设置了一个标题作为响应。但是我得到的请求 header 为空。 这些是我在 Controller 中的方法。两者都在同一个 Controller 中。
@RequestMapping(value="/testStart", method=RequestMethod.POST)
public String testStart(HttpServletRequest request, HttpServletResponse response){
String token = "126712810-1289291":
response.addHeader("authToken", token);
return "redirect:/test";
}
@RequestMapping(value="/test", method={ RequestMethod.POST, RequestMethod.GET })
public String getTestPage(Model model, HttpServletRequest request, HttpServletResponse response){
String token = request.getHeader("authToken");
System.out.println(token); //prints null
model.addAttribute("Testtoken", token);
System.out.println("Test page about to load ..");
return "test";
}
我正在使用 postman 客户端来测试这个 api。它正在点击 url 并重定向到其他 url。但标题为空。 我不知道出了什么问题。谁能帮我解决这个问题?谢谢
最佳答案
使用 Redirect 方法,Web 应用程序告诉浏览器加载您要重定向的页面。所以这会从浏览器发出新的 http 请求,此时原始请求无法访问。
所以你的问题可以用Forward方法解决。 Web 应用在内部将所有请求数据转发到另一个处理程序方法
return "forward:/test";
此外,请更改您的
String token = request.getHeader("authToken");
与
String token = response.getHeader("authToken");
因为您正在将 authToken 添加到响应对象。(来自评论 HttpServletResponse -> getHeader(String name) 自 Servlet 3.0 起有效)
编辑:
此代码将是您完整的解决方案 "/test"
方法支持转发请求,也支持来自浏览器的请求。
(您想从请求中获取 token 信息,因为您想在不转发的情况下调用/test 方法,所以它以这种方式工作,但是在转发时您无法添加 header ,因此您尝试在响应中添加并从请求中获取它,但这不起作用以这种方式,所以你需要根据调度程序的类型解析 token ,所以检查代码)
@RequestMapping(value="/testStart", method=RequestMethod.POST)
public String testStart(HttpServletRequest request, HttpServletResponse response){
String token = "126712810-1289291";
request.setAttribute("authToken", token);
return "forward:/test";
}
@RequestMapping(value="/test", method={ RequestMethod.POST, RequestMethod.GET })
public String getTestPage(Model model, HttpServletRequest request, HttpServletResponse response)
{
//-----------------
//resolving token
String token = null;
DispatcherType type = request.getDispatcherType();
if(type == DispatcherType.FORWARD)
{
token = (String) request.getAttribute("authToken");
}
else if(type == DispatcherType.REQUEST)
{
token = (String) request.getHeader("authToken");
}
//-----------------
System.out.println(token); //prints the value
model.addAttribute("Testtoken", token);
System.out.println("Test page about to load ..");
return "test";
}
关于java - 请求 header 在 spring mvc 中变得为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39222045/