我在公司的 Java 代码中遇到了身份验证代码。该应用程序是一组基于 Spring MVC 构建的多个 REST 服务。在 HttpServletRequest 对象上的一个身份验证服务中调用了一种方法,称为 getHeader()。该方法检索 AuthId。为什么他们会在 Spring MVC 应用程序中使用 HttpServletRequest?在 spring app 中使用这个 servlet 类型代码有什么好处?这种方法会做什么?有什么选择吗?
3 回答
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 中获取。
Spring MVC 建立在Servlet
API 之上。任何你可以用 a 做的事情Servlet
,你都可以用 Spring MVC 做。Spring MVC 框架提供的是一个包装器,用于以特定的架构风格对 Web 应用程序进行编码。这个包装器增加了行为,有时还简化了任务。
为什么他们会在 Spring MVC 应用程序中使用 HttpServletRequest?
在这种情况下,因为它是获取标头的最直接方式。
在 spring app 中使用这个 servlet 类型代码有什么好处?
Spring 不需要包装任何东西。您可以直接从源头获取。
这种方法会做什么?
有什么选择吗?
在@Controller
类的处理程序方法中,您可以声明一个带有注释的参数,@RequestHeader
并让 Spring 传递一个从HttpServletRequest
标头中检索的参数。
默认情况下,这仅限于@Controller
使用 注释的方法@RequestMapping
。如果您的服务类是HandlerInterceptor
、Filter
或其他类型的类并且仅具有对HttpServletRequest
对象的引用,那么您只能使用 直接检索它getHeader(String)
。
这是一种替代方法: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
...
}