0

コントローラーで取得すると LoginModel フィールド (strLogintype、strUserType) が「null」になるため、春のセキュリティと共に「commandName」属性を使用すると、フロントエンドから選択されたドロップダウン値が取得されません。

しかし、春のセキュリティを使用していないときは、同じコードで問題なく動作します

私のログイン JSP コードは次のようになります。

                    <script>
        $(document).ready(function() {
        $type = $("select[id='userType']");
        $page = $("select[id='signInPage']");
        $("<option>Account Summary</option>").appendTo($page);
        $("<option>Basket Order</option>").appendTo($page);
        $("<option>Portfolio</option>").appendTo($page);
        $type.change(function() {
                    ...
        });
        });
        </script>                              
    <c:set var = "url" value = "/j_spring_security_check" />
    <form:form method="post" commandName="portalLogin" action="${pageContext.servletContext.contextPath}${url}" name="f">
    <form:select path ="strUserType" style="font-family: tahoma;font-style: normal;font-size: 11px;" id="userType">
                  <form:option value="retail" selected="selected">Retail</form:option>
                  <form:option value="admin">Admin</form:option>
    </form:select>
    <div class="left"><spring:message code="label.startIn" /></div>
    <form:select path="strLogintype" style="font-family: tahoma;font-style: normal;font-size: 11px;" id="signInPage" > </form:select>

私のコントローラーコードは次のようなものです:

       @RequestMapping("/signIn")
    public ModelAndView onClickLogin(
    @ModelAttribute("portalLogin") LoginModel loginModel, Model model,HttpServletRequest request) {

    strLoginPg = loginModel.getStrLogintype();
    if (strLoginPg != null && strLoginPg.equals("Basket Order")) {
        return new ModelAndView("redirect:BasketOrders.html");
    } else if (strLoginPg != null && strLoginPg.equals("Portfolio")) {
        return new ModelAndView("redirect:portfolio.html");
    } else if (strLoginPg != null && strLoginPg.equals("Account Summary")) {
        return new ModelAndView("redirect:accountSummary.html");
    } else if (strLoginPg != null && strLoginPg.equals("General Settings")) {
        return new ModelAndView("redirect:settings.html");
    } else{
                    return new ModelAndView("redirect:adminConfig.html");
            }}

[更新]: 2 つの方法を試しました。

カスタム authenticationsuccesshandler を作成しました。LoginController はそのままです。アプリケーションを実行すると、CustomSimpleURLAuthenticationSuccessHandler が起動されていることがわかりますが、ここでも、選択したドロップダウン値をコントローラーのフロントエンドから取得しておらず、代わりに null です。別のページ (adminConfig) に移動します。

2番目の方法:

以前のコードに戻しました。LoginController の「onClickLogin」メソッドに @RequestParam 属性を使用しました。

   @RequestMapping("/signIn")
public ModelAndView onClickLogin(
        @ModelAttribute("portalLogin") LoginModel loginModel, @RequestParam("strLogintype") String strtype, Model model,HttpServletRequest request) {

jsp ページ:

   <form:select path="strLogintype" name="strLogintype" style="font-family: tahoma;font-style: normal;font-size: 11px;" id="strLogintype" >

しかし、「HTTP ステータス 400 - 必要な文字列パラメーター 'strLogintype' が存在しません」というエラーが表示されます。また、「クライアントから送信されたリクエストは構文的に正しくありませんでした」とも表示されます。ここで何がうまくいかないのですか?また、@RequestParam は、jsp ページで「選択された」ドロップダウン値を取得する目的を果たしますか。

コントロールがSpring Securityに移行し、コントローラーが呼び出されたときに、選択したドロップダウン値を保持するにはどうすればよいですか?

4

1 に答える 1

0

以下を追加した後、動作するようになりました。

  1. web.xml の RequestContextListener

           <listener>
           <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
           </listener>
    
  2. CustomUsernamePasswordAuthenticationFilter クラス

        public class CustomUsernamePasswordAuthenticationFilter extends
    UsernamePasswordAuthenticationFilter {
        @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        final String strLogintype = request.getParameter("strLogintype");
        request.getSession().setAttribute("strLogintype", strLogintype);
        return super.attemptAuthentication(request, response); 
    } 
    }
    
  3. CustomSimpleURLAuthenticationSuccessHandler クラス

            public class CustomSimpleURLAuthenticationSuccessHandler extends
    SimpleUrlAuthenticationSuccessHandler {
            public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws IOException, ServletException {
    
        final String strLogintype = request.getParameter("strLogintype");
        String session= (String)request.getSession().getAttribute("strLogintype");
        setDefaultTargetUrl("/signIn.html?strLoginPg=" + request.getParameter("strLogintype"));
        super.onAuthenticationSuccess(request, response, authentication);
    }
    }
    

CustomUsernamePasswordAuthenticationFilter クラス自体が追加のパラメーターをセッションに格納する作業を行っていることに気付きました。CustomSimpleURLAuthenticationSuccessHandler を使用して、追加のパラメーター (strLoginPg) を DefaultTargetUrl (/signIn.html) に追加しました。これは、コンテキスト xml の他の属性では実行できなかったと思います。ありがとう。

于 2013-04-25T16:07:30.080 に答える