当前位置: 首页 > 知识库问答 >
问题:

未找到带有spring security的URI的HTTP请求的映射

谢清野
2023-03-14

我正在尝试学习Spring Security性,第一个代码示例是在运行URL“http://localhost:8080/spring-security-helloworld-xml/welcome”并使用jetty插件作为服务器时出现这样的错误。

错误:org.springframework.web.servlet.pageNotFound noHandlerFound警告:在名为“mvc-dispatcher”的DispatcherServlet中找不到URI为[/spring-security-helloworld-xml/]的HTTP请求的映射

这是web.xml:

<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Spring MVC Application</display-name>

<!-- Spring MVC -->
<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-security.xml
    </param-value>
</context-param>

<!-- Spring Security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

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

这是我的控制器HelloConroller.java:

package com.mkyong.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {

@RequestMapping(value = { "/", "/welcome**" }, method = RequestMethod.GET)
public ModelAndView welcomePage() {

    ModelAndView model = new ModelAndView();
    model.addObject("title", "Spring Security Hello World");
    model.addObject("message", "This is welcome page!");
    model.setViewName("hello");
    return model;

}

@RequestMapping(value = "/admin**", method = RequestMethod.GET)
public ModelAndView adminPage() {

    ModelAndView model = new ModelAndView();
    model.addObject("title", "Spring Security Hello World");
    model.addObject("message", "This is protected page!");
    model.setViewName("admin");

    return model;

}

}

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="com.mkyong.*" />

<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/pages/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">
<http auto-config="true">
    <intercept-url pattern="/admin**" access="ROLE_USER" />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="mkyong" password="123456" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

共有1个答案

祁承嗣
2023-03-14

问题似乎出在web.xml

基本上是用这些线

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-security.xml
    </param-value>
</context-param>

您正在加载spring-security.xml作为应用程序的根上下文(它是由web.xml开头定义的org.springframework.web.servlet.DispatcherServlet加载的,因为您没有为它指定自定义上下文):但是这个上下文似乎没有mvc-dispatcher-servlet.xml中定义的任何bean的任何概念(您实际上通过component-scan标记加载beanHelloController

现在,我不知道您的项目实际上是如何结构化的,但是为了快速解决这个问题,您可以简单地在spring-security.xml中包含mvc-dispatcher-servlet.xml

<import resource="[path to web-dispatcher-servlet]" />

这不是一个真正干净的解决方案,但它应该适用于您的情况。我建议你在进入安全领域之前先研究一下国际奥委会的容器。Spring security确实是作为一个过滤器工作的,不过在配置它时,了解Spring IoC是非常有用的。

作为个人建议,通常Spring webapp上下文的结构如下

  • 根上下文(定义DB连接、事务管理、DAO和所有其他通用bean)
  • web上下文,定义映射和控制器
  • 安全上下文,通常包含在根上下文中,以便在需要时利用方法安全性来定义所有与安全相关的内容
 类似资料:
  • Dispatcher servlet(servlet-context.xml) http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xs

  • 很抱歉再次问这种问题,但我无法通过查看其他线程和Spring doc来解决我的问题。 我正在使用maven的3.1.0.RELEASE,并尝试使用注释和java配置。 以下是我的web.xml: 这是我的档案web-application-config.xml. 我有两个类。第一个配置视图解析器 第二个定义我的控制器: 根据我的配置,我想一切都应该指向我的home()函数。然而,事实并非如此,以下

  • 我写了一个spring boot项目。它有三个文件。 appconfig.java HelloController.java 当我尝试运行它时,它出现了错误“没有为名为'DispatcherServlet中URI[/springc1_01/]的HTTP请求找到映射”。这是因为服务器没有找到控制器还是其他原因?THX.

  • 问题内容: 我的处理程序转发到internalresourceview’apiForm’,但随后出现错误404 RequestURI = / WEB-INF / pages / apiForm.jsp。我确定apiForm.jsp位于/ WEB-INF / pages / 这就是我的dispatcher.xml的样子。 问题答案: 看起来DispatcherServlet正在尝试处理对apiFor

  • 每当我向RequestMapping路径添加任何内容时,我都有一个问题,那就是解析CSS文件的路径。在下面的示例中,如果更改

  • 在学习Spring时,我试图运行Spring in Action的代码示例,但它向我展示了tomcat日志中提到的以下错误: 我正在尝试仅借助基于java的配置来配置spring。相同的代码如下所述: TestProjectInitializer.java WebConfig.java 根配置.java HomeController.java pom.xml web.xml 目录结构 请帮助我了解