如何在 @service 类中获取 HttpServletRequest 对象
Posted
技术标签:
【中文标题】如何在 @service 类中获取 HttpServletRequest 对象【英文标题】:How do I get HttpServletRequestObject in the @service class 【发布时间】:2011-06-15 06:00:21 【问题描述】:我成功地集成了 Spring 和 Spring4GWT。 一切正常。
我面临的唯一问题是如何在@service
类中获得HttpServletRequestObject
?
一些配置和代码
web.xml
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>org.spring4gwt.server.SpringGwtRemoteServiceServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/ui/test/*</url-pattern>
</servlet-mapping>
服务类
public class LoginServiceImpl implements ILoginService
private IUserService userService;
public LoginServiceImpl(IUserService userService)
super();
this.userService = userService;
public boolean isAuthenticUser(String userName, String password)
// operation
在LoginServiceImpl
中,我无法获取 Servlet 对象。
我在这里需要它,以便我可以将它用于不同的目的。
有什么想法吗?
【问题讨论】:
这些不同的目的到底是什么? 看看 Spring Security,你不想重新实现已经存在并且可以免费使用的东西。 我理解,但从广义上讲,我的问题是关于在 GWT-RPC 服务中使用 HttpServletRequest 对象。 【参考方案1】:我终于找到了解决方案。 如果有人想访问 GWT-RPC 服务中的 HttpServletrequest,那么以下内容会有所帮助。
修改web.xml
<filter>
<filter-name>springRequestFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>springRequestFilter</filter-name>
<url-pattern>/your_pattern/*</url-pattern>
</filter-mapping>
服务中
ServletRequestAttributes sra = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes());
sra.getRequest();
希望对你有帮助
【讨论】:
请注意,作为 URL 模式,我使用与 spring4gwt servlet 相同的值【参考方案2】:从设计的角度来看,you should NOT have a HttpServletRequest object in your service layer
。相反,从请求中检索您需要的任何信息并将它们作为参数传递给您的服务层。
请详细说明您正在尝试做什么以及为什么您的服务层中需要一个 HttpServletRequest 对象。
否则你的依赖层次结构会有循环。视图层依赖服务层,服务层依赖视图层。
【讨论】:
这是一个 GWT 问题。我不想让你感到困惑。LoginServiceImpl
是一个 org.spring4gwt.server.SpringGwtRemoteServiceServlet
类型的 servlet,它处理所有请求。
好吧,GWT 的设计是每个服务类都应该实现 RemoteServiceServlet,所以……但是你没有错,“作为参数传递参数”部分也是由 GWT-RPC 框架完成的。跨度>
【参考方案3】:
您需要将 HttpServletRequest 从控制器传递给服务方法(例如作为方法参数)。
无论如何:
您的服务方法应该从 httpServletRequestObject 之类的东西中抽象出来。这种抽象通常在(Web)控制器中完成。 看起来你重新发明了安全的东西,你看过Spring Security吗?【讨论】:
【参考方案4】:还有替代解决方案,当您还需要 HttpServletResponse
时可能会派上用场。
简单地说:
让你的ServiceImpl
类扩展org.spring4gwt.server.SpringGwtRemoteServiceServlet
(无论如何你都应该这样做)
然后更改SpringGwtRemoteServiceServlet#getBean()
以返回this
对象
只要您的web.xml
引用您的ServiceImpl
而不是直接引用Spring4GWT,this
将是您的ServiceImpl
扩展SpringGwtRemoteServiceServlet
的实例。这也是标准的 GWT 方式,您甚至可以使用 @RemoteServiceRelativePath 将其自动化。
您还希望通过 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
运行 servlet(上面的 this
对象)以完成依赖注入
这样您的ServiceImpl
也将成为响应请求的servlet,并且能够从父类访问getThreadLocalRequest()
它并没有看起来那么老套。基本上,GWT 希望您的服务类是 servlet,而 Spring4GWT 希望它是标准的 Spring 组件。这种方法介于两者之间。
【讨论】:
以上是关于如何在 @service 类中获取 HttpServletRequest 对象的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot 普通类中获取Bean对象(dao、service...)
关于如何在 android 的安装类中使用 Rest API(service) 传递 ParseObject(Object)?
Restful:如何访问 Service 类中的 Httpsession?