4

ユーザーがランディング ページからログインできる Web アプリを作成しようとしていますindex.htm。このアクションはLoginControllerにマップされ、ログインが成功した後、ユーザーを同じログイン ユーザーに戻しindex.htm、ウェルカム メッセージでユーザーに挨拶します。

index.htm には itemform という名前の別のフォームもあり、ユーザーはアイテム名をテキストとして追加できます。このアクションは、itemController によって制御されます。

私の問題は、LoginControlleritemControllerの両方が同じであるため、次の@RequestMappingエラーが発生することです。

ServletContext リソース [/WEB-INF/tinga-servlet.xml] で定義された「org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0」という名前の Bean の作成中にエラーが発生しました: Bean の初期化に失敗しました。ネストされた例外は java.lang.IllegalStateException: ハンドラー [loginController] を URL パス [/index.htm] にマップできません: 既にハンドラー [com.tinga.LoginController@bf5555] がマップされています。

ハンドラー [loginController] を URL パス [/index.htm] にマップできません: 既にハンドラー [com.tinga.LoginController@bf5555] がマップされています。

この問題に取り組むにはどうすればよいですか?

4

4 に答える 4

2
@RequestMapping(value="/login.htm")
public ModelAndView login(HttpServletRequest request, HttpServletResponse response) {
   // show login page if no parameters given
   // process login if parameters are given
}

@RequestMapping(value="/index.htm")
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
   // show the index page
}

最後に、リクエストをインターセプトするサーブレット フィルターが必要です。login.htm ページをリクエストしていない場合は、ユーザーがログインしていることを確認する必要があります。 . そうでない場合は、/login.htm への転送を発行します。

public class LoginFilter implements Filter {
  public void doFilter(ServletRequest request,  ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

    HttpServletRequest httpServletRequest = (HttpServletRequest)request;

    boolean loggedIn = ...; // determine if the user is logged in.
    boolean isLoginPage = ...; // use path to see if it's the login page

    if (loggedIn || isLoginPage) {
        chain.doFilter(request, response);
    }
    else {
        request.getRequestDispatcher("/login.htm").forward(request, response);
    }
  }
}

そしてweb.xmlで

私のデプロイメント記述子の例:

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>LoginFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>  
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping>

これはすべて記憶によるものですが、これを行う方法についての一般的なアイデアが得られるはずです。

于 2012-07-24T04:26:50.577 に答える
1

すべてのコントローラーのリクエスト マッピングは、Spring MVC で一意である必要があります。

于 2012-07-23T06:35:39.457 に答える
0

おそらく、同じ @RequestMapping を持つコントローラーで、次のようにメソッド (GET、POST...) を定義する必要があります。

@RequestMapping(value="/index.htm", method = RequestMethod.GET)
@RequestMapping(value="/index.htm", method = RequestMethod.POST)

フォームをレンダリングし、データ (何らかのオブジェクト) をフォームにバインドするために使用する GET メソッドを持つコントローラー。フォームの送信と検証を処理するために通常使用する POST メソッドを持つコントローラー。

于 2012-07-24T00:18:46.653 に答える
0

フォームに隠しパラメーターを追加して区別し、post メソッドの注釈に params 属性を追加して区別します。

<form:hidden name="hiddenAction" value="login" />
<form:hidden name="hiddenAction" value="item" />

@RequestMapping(method = RequestMethod.POST, params = {"hiddenAction=login"})
@RequestMapping(method = RequestMethod.POST, params = {"hiddenAction=item"})
于 2012-12-19T15:29:16.710 に答える