0

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

4

3 回答 3

2

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

例如,您可以获得如下所示的标头值Content-Type

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

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

例如,在这个随机UrlUtil 中查看这个方法:

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

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

于 2013-10-27T20:49:15.653 回答
1

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

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

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

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

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

这种方法会做什么?

阅读 javadoc。

有什么选择吗?

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

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

于 2013-10-27T20:49:00.637 回答
0

这是一种替代方法: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
    ...
}
于 2013-10-27T20:48:56.823 回答