我在公司的java代码中遇到了身份验证代码。该应用程序是一组基于Spring MVC构建的REST服务。在HttpServletRequest对象上的一个名为getHeader()的身份验证服务中调用了一个方法。并且该方法检索AuthId。为什么他们会在spring MVC应用程序中使用HttpServletRequest?在spring应用程序中使用此servlet类型代码有什么好处?这种方法会做什么?任何替代方案?
答案 0 :(得分:1)
Spring MVC构建于Servlet
API之上。你可以使用Servlet
做任何事情,因此可以使用Spring MVC。 Spring MVC框架提供的是以特定体系结构样式编写Web应用程序代码的包装器。这个包装器增加了行为,有时简化了任务。
为什么他们会在spring MVC应用程序中使用HttpServletRequest?
在这种情况下,因为它是获取标题的最直接方式。
在spring中使用此servlet类型代码有什么好处 应用?
春天不需要包装任何东西。你直接从源头获得它。
这种方法会做什么?
任何替代方案?
在@Controller
课程中#39; handler方法,您可以声明一个用@RequestHeader
注释的参数,并让Spring传递一个它从HttpServletRequest
标头中检索的参数。
默认情况下,这仅限于使用@Controller
注释的@RequestMapping
方法。如果您的服务类是HandlerInterceptor
,Filter
或其他类型的类,并且只是对HttpServletRequest
对象的引用,那么您无法再使用{直接检索它{1}}。
答案 1 :(得分:1)
Spring MVC在HttpServletRequest
之上提供了许多精彩的抽象,因此您可以避免其低级实现细节。您很少需要直接访问它。
例如,您可以获得类似Content-Type
的标头值:
@GET
@Path("/myService")
public Response doSomething(@HeaderParam("Content-Type") String contentType) {
...
}
但有时您确实需要直接访问HttpServletRequest
- 通常在您使用其他需要它的API时。如果你正在使用一个需要HttpServletRequest
的方法的其他库,那么你必须直接从Spring MVC中获取它。
例如,请在此随机UrlUtil
class中查看此方法:
public static String encodeUrlPathSegment(String pathSegment, HttpServletRequest httpServletRequest) {
//Get a path segment
}
你别无选择,只能从Spring MVC中获取HttpServletRequest
。
答案 2 :(得分: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
...
}