java - 请求 header 在 spring mvc 中变得为空

标签 java spring spring-mvc

我的 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/

相关文章:

java - 在java中解析magento json

java - 需要从 JSP 生成 PDF 的建议

java - 将 int 转换为 Java 中的二进制字符串表示形式?

java - @Entity中的@Transactional不起作用?

spring - 无法连接到运行 Junit 测试的 Redis

java - Android 中的 SQLite OpenDatabase 问题

spring - 如何在 Spring Data 的查询中使用表函数

java - Spring上下文引用java

json - 在单个请求中渲染多个 View

java - @RequestBody 注释究竟是如何工作的以及它与 HttpMessageConverter 接口(interface)有何关系?