【问题标题】:use HttpServletRequest in my Spring MVC application? Any benefits?在我的 Spring MVC 应用程序中使用 HttpServletRequest?有什么好处吗?
【发布时间】:2013-11-06 13:02:02
【问题描述】:

我在公司的 Java 代码中发现了身份验证代码。该应用程序是一组基于 Spring MVC 构建的多个 REST 服务。在 HttpServletRequest 对象上的一个身份验证服务中调用了一种方法,称为 getHeader()。该方法检索 AuthId。为什么他们会在 Spring MVC 应用程序中使用 HttpServletRequest?在 spring app 中使用这个 servlet 类型代码有什么好处?这种方法会做什么?有其他选择吗?

【问题讨论】:

    标签: java servlets spring-mvc


    【解决方案1】:

    Spring MVC 在HttpServletRequest 之上提供了许多绝妙的抽象,因此您可以避免它的低级实现细节。您很少需要直接访问它。

    例如,您可以获得像 Content-Type 这样的标头值:

    @GET
    @Path("/myService")
    public Response doSomething(@HeaderParam("Content-Type") String contentType) {
    ...
    }
    

    但有时您确实需要直接访问HttpServletRequest——通常是在您使用另一个需要它的 API 时。如果你正在使用其他库和你需要的方法,需要HttpServletRequest,那么你必须直接从 Spring MVC 中获取它。

    比如在这个随机UrlUtilclass中查看这个方法:

    public static String encodeUrlPathSegment(String pathSegment, HttpServletRequest httpServletRequest) {
    //Get a path segment
    }
    

    你别无选择,只能从 Spring MVC 中获取 HttpServletRequest

    【讨论】:

      【解决方案2】:

      Spring MVC 建立在 Servlet API 之上。任何你可以用 Servlet 做的事情,你都可以用 Spring MVC 做。 Spring MVC 框架提供的是一个包装器,用于以特定的架构风格对 Web 应用程序进行编码。这个包装器增加了行为,有时还简化了任务。

      他们为什么要在 Spring MVC 应用程序中使用 HttpServletRequest?

      在这种情况下,因为它是获取header的最直接的方式。

      在spring中使用这个servlet类型代码有什么好处 应用?

      Spring 不需要包装任何东西。您可以直接从源头获取。

      这个方法会做什么?

      Read the javadoc.

      还有其他选择吗?

      @Controller 类的处理程序方法中,您可以声明一个带有@RequestHeader 注释的参数,并让Spring 传递一个从HttpServletRequest 标头检索的参数。

      默认情况下,这仅限于使用 @RequestMapping 注释的 @Controller 方法。如果您的服务类是HandlerInterceptorFilter 或其他类型的类,并且只是引用了HttpServletRequest 对象,那么您只能使用getHeader(String) 直接检索它。

      【讨论】:

        【解决方案3】:

        这里有一个替代方案:Spring MVC 定义参数注解@RequestHeader 来读取httpServletRequest 标头:

        @RequestMapping(...)
        public @ResponseBody String myMethod(@RequestHeader String AuthId){
            //the value of the parameter AuthId is the value of request header named AuthId
            ...
        }
        

        【讨论】:

          猜你喜欢
          • 2017-01-07
          • 2015-01-16
          • 1970-01-01
          • 1970-01-01
          • 2012-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-04
          相关资源
          最近更新 更多