4

我正在尝试制作一个允许用户从登录页面登录的网络应用程序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
}

最后,您需要一个 servlet 过滤器来拦截请求,如果您不请求 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

Maybe in your controllers with the same @RequestMapping you should define the Method (GET, POST...), like this way:

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

The controller with the GET method you use to render the form and bind the data (some object) to it. The controller with POST method you usually use to process the submission and validation of the form.

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