3

我有 Apache Wiket + Spring Web 应用程序,可以正常工作。目前 Spring 使用 DI 框架和过滤移动访问。我们计划在我们的应用程序中使用 Spring Rest,你能告诉我如何在我们现有的 web xml 中做到这一点。
最初,现有的 Web 会话将使用 Rest Api 来访问数据(使用 ajax 调用的 ui 页面),因此我希望 Rest 控制器能够访问现有的 Wicket http 会话(如果使用登录)。例如:来自现有 http 会话的 rest 调用应该能够访问现有的 http 会话。任何的想法 ?感谢并感谢您的时间。

我的想法是使用带有标签的 '<code>org.springframework.web.servlet.DispatcherServlet' ,但是我怀疑这种方式是我想要共享同一个会话吗?

我现有的web.xml(工作)

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:myapp-spring-config.xml
    </param-value>
</context-param>
<filter>
    <filter-name>myapp</filter-name>
    <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
    <init-param>
        <param-name>applicationFactoryClassName</param-name>
        <param-value>org.apache.wicket.spring.SpringWebApplicationFactory</param-value>
    </init-param>
</filter>

<filter>
   <filter-name>myappMobileRequestFilter</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
   <filter-name>myappMobileRequestFilter</filter-name>
   <url-pattern>/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>ERROR</dispatcher>
</filter-mapping>

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<listener>
<listener-class>
    org.springframework.web.context.request.RequestContextListener
</listener-class>

4

2 回答 2

5

为我解决了!感谢您指导我到WicketSessionFilter. 我在这里发布答案以供任何人将来参考或建议(如果需要)..

我/我们在web.xml上面发布的“除了”中所做的更改web.xml

  <filter>
        <filter-name>SessionFilter</filter-name>
        <filter-class>org.apache.wicket.protocol.http.servlet.WicketSessionFilter</filter-class>
        <init-param>
            <param-name>filterName</param-name>
            <param-value>myapp</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>SessionFilter</filter-name>
        <url-pattern>/rest/*</url-pattern>
    </filter-mapping>

    <servlet>
            <servlet-name>mvc-dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
            <servlet-name>mvc-dispatcher</servlet-name>
            <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

如您所见,我添加了一个WicketSessionFilterto 来过滤/rest/*spring 消耗的请求DispatcherServlet

如果你想在 Spring rest 控制器中访问 spring 会话,你所要做的就是如下:

@RestController
@RequestMapping("/service")
public class TestServiceController {


    @RequestMapping(value = "/getValue/{name}", method = RequestMethod.GET)
    @SuppressWarnings("unused")
    public String getValue(@PathVariable String name,HttpServletRequest request, HttpServletResponse response) {

      HttpSession session = request.getSession(false);
      WebSession wicketSession = session.getAttribute("wicket:wicket.myapp:session");

          //rest of the code here ........
                 return result;
     }

Spring-rest & Wicket 从此过着幸福的生活......

于 2015-08-27T11:12:48.333 回答
1

由于 Wicket 的 Filter 和 Spring 的 Servlet 都在同一个 web.xml 中,所以它们将共享同一个javax.servlet.HttpSession。如果您需要能够在 Spring 的 REST 处理程序中访问 Wicket 的org.apache.wicket.Session,那么您将需要设置 Wicket 的 WicketSessionFilter [1]。

  1. https://github.com/apache/wicket/blob/8d23f188e8509e4fae945bbfb9710c489c57423c/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/WicketSessionFilter.java
于 2015-08-22T21:16:38.907 回答