2

Glassfish の同じ WAR ファイル内に Jersey 1.13 と Struts 2 をデプロイしようとしています。

非常に古いバージョンの Glassfish を使用していますが、残念ながらこのバージョン (バージョン = Sun Java System Application Server 9.1_02) に固執しています。

Struts 2 の構成は、ドキュメントのとおりです。問題は、フィルターがすべての URL をインターセプトし、Struts 2 構成を介してそれらを処理しようとすることです。私の質問は、Struts 2 アプリケーションと同じ war 内で Jersey (または任意のサーブレット) をどのようにデプロイするのですか?

以下は、私が使用している web.xml ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<servlet>
    <servlet-name>JerseyServletAdaptor</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.example.portal.api</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>JerseyServletAdaptor</servlet-name>
    <url-pattern>/helloworld</url-pattern>
</servlet-mapping>
<listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>

<context-param>
    <param-name>org.apache.tiles.impl.BasicTilesConatiner.DEFINITIONS_CONFIG</param-name>
    <param-value>tiles.xml</param-value>
</context-param>

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>com.example.portal.web.actions.WLSessionFilterDispatcher</filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
    <welcome-file>/jsp/index.html</welcome-file>
</welcome-file-list>

</web-app>
4

2 に答える 2

4

私はこれを次のように解決することができました:

web.xml内

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<servlet>
    <servlet-name>JerseyServletAdaptor</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.example.portal.api</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>JerseyServletAdaptor</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>com.example.portal.web.actions.WLSessionFilterDispatcher</filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

struts.xmlで、これを要素の下に追加しました

<constant name="struts.action.excludePattern" value="/api/.*" />

URLは引き続き最初にstrutsフレームワークに送信されますが、上記のexcludePatternのために無視されます。これにより、サーブレットマッピングでURLを処理し、Jerseyフレームワークに渡すことができます。

このアプローチは、Jersey URLにapi(または定義したもの)をプレフィックスとして付ける必要があることを意味します。

http://<domain-name>/api/resource/id

これは、セキュリティをミックスに追加するまで機能します。問題は、StrutsにFORMベースの認証を使用し、Jerseyに基本認証を使用したいことに起因します。残念ながら、web.xmlでは、アプリケーションに対して単一のlogin-configしか定義できません。つまり、StrutsとJerseyの両方でFORMベースの認証または基本認証のいずれかを使用してスタックしていました。

これを考慮して、Jerseyアプリケーションを独自のWARにデプロイすることにしました。これは、最終的に上記のソリューションを使用することにならないことを意味します。良いニュースは、異なる認証方法(または任意の認証)を使用したくない場合、上記のアプローチは、同じWARにJerseyとStruts2をデプロイするために機能することです。

于 2012-08-09T00:21:54.807 に答える