我正在使用Spring MVC控制器。我有一个控制器DataController
。
我正在考虑使用HttpServletRequest
在DataController
类的顶部添加@Inject
作为注射剂。
@Controller
public class DataController {
@Inject
HttpServletRequest request;
// .. some code here
@RequestMapping(value = "process", method = RequestMethod.GET)
public @ResponseBody
DataResponse processTask(@RequestParam("workflow") final String workflow) {
String ipAddress = request.getRemoteAddr();
System.out.println(ipAddress);
}
所以我的问题是 - 这是使用@Inject
的正确方法吗?我之前从未使用过@Inject,因此试图了解我的做法是否正确?从每次调用processTask
方法开始,我都需要获取正在调用processTask
方法的ipAddress。
答案 0 :(得分:0)
在获取HttpServletRequest
方面:从语义上讲,这绝对是错误的。
原因:HttpServletRequest
是仅在用户发送请求时创建的对象,并在请求的用户操作完成后销毁。你只需要以这种方式存储它(从语法角度),但你不应该(从语义角度)。您需要意识到Web应用程序的工作方式与桌面应用程序不完全相同(并且不要从同一角度观察它们)。
<强>建议强>:
@RequestMapping(value = "process", method = RequestMethod.GET)
public @ResponseBody
DataResponse processTask(@RequestParam("workflow") final String workflow, HttpServletRequest request) {...}
这样,每次调用processTask
方法时,您都会收到相应的请求。 (HttpServletRequest对象由@RequestMapping
注入。)
(如果您希望在会话中保留一些内容,请考虑使用
的bean 建议:
@Inject private UserService userService;
(假设我们有一个名为UserService
的类。)
答案 1 :(得分:-1)
你不能注射&#34;就我所知,HttpServletRequest使用它的唯一方法是添加为方法成员。像这样:
@Controller
public class DataController {
// .. some code here
@RequestMapping(value = "process", method = RequestMethod.GET)
public @ResponseBody
DataResponse processTask(@RequestParam("workflow") final String workflow,HttpServletRequest request) {
String ipAddress = request.getRemoteAddr();
System.out.println(ipAddress);
}