0

当我使用'commandName'属性和spring security时,我没有从前端获得选定的下拉值,因为当我在控制器中获取它时,LoginModel字段(strLogintype,strUserType)变为'null'。

但是当我不使用spring security时,相同的代码可以正常工作。我确实尝试了link1link2中提到的解决方案,但它在我的情况下不起作用。

我的登录 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");
            }}

[更新]:我尝试了两种方法:

我创建了自定义 authenticationsuccesshandler.LoginController 与它相同。当我运行应用程序时,我看到 CustomSimpleURLAuthenticationSuccessHandler 被触发,但在这里我再次没有从控制器的前端获取选定的下拉值,而是它为 null。因为这个我登陆不同的页面(adminConfig)。

第二种方式:

我恢复到我之前的代码。我只是将@RequestParam 属性用于 LoginController 的“onClickLogin”方法。

   @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 回答