如何在@service类中获取HttpServletRequest对象

时间:2011-06-15 06:00:21

标签: spring gwt web.xml gwt-rpc

我成功地整合了Spring和Spring4GWT。 一切都很好。

我面临的唯一问题是如何在HttpServletRequestObject课程中获得@service

一些配置和代码

的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对象。 我需要它,以便我可以将它用于不同的目的。

任何想法?

4 个答案:

答案 0 :(得分:4)

最后我得到了一个解决方案。 如果有人想要在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();

希望这是有帮助的

答案 1 :(得分:2)

从设计的角度来看,you should NOT have a HttpServletRequest object in your service layer。相反,从请求中检索您需要的信息,并将它们作为参数传递给您的服务层。

请详细说明您要执行的操作以及您在服务层中需要HttpServletRequest对象的原因。

否则您的依赖关系层次结构将具有循环。根据视图层查看依赖于服务层和服务层的图层。

答案 2 :(得分:1)

您需要将HttpServletRequest从Controller传递给服务方法(例如作为方法参数)。

反正:

  • 您的服务方法应该从httpServletRequestObject之类的东西中抽象出来。这种抽象通常在(Web)控制器中完成。
  • 看起来你重新发明安全资料,你看过Spring Security吗?

答案 3 :(得分:1)

还有另一种解决方案,当您还需要HttpServletResponse时,它可能会派上用场。

简单地说:

  • 让您的ServiceImpl课程延长org.spring4gwt.server.SpringGwtRemoteServiceServlet(无论如何都应该这样做)
  • 然后更改SpringGwtRemoteServiceServlet#getBean()以返回this对象
  • 只要您的this直接引用您的ServiceImpl而不是Spring4GWT,{li> SpringGwtRemoteServiceServlet将成为web.xml延长ServiceImpl的实例。这也是标准的GWT方式,你甚至可以使用@RemoteServiceRelativePath自动化它。
  • 您还希望通过this运行servlet(上面的SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)对象)以完成依赖注入
  • 这样你的ServiceImpl也将是响应请求的servlet,并且能够从父类访问getThreadLocalRequest()

它看起来并不是那种hacky。基本上GWT希望你的服务类是servlet,而Spring4GWT希望它是标准的Spring组件。这种方法介于两者之间。