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

Spring Security 3.1.3问题

齐兴运
2023-03-14

我使用的是Spring Security 3.1.3。在我的maven pom中发布,因为我正在阅读的书是2013年的,他们使用了这本书,并有以下代码片段:

//管理员控制器

@Controller
@RequestMapping("/admin")
public class AdminController {

    @RequestMapping(method=RequestMethod.POST, value="/movies")
    @ResponseBody
    public String createMovie(@RequestBody String movie) {
        System.out.println("Adding movie!! "+movie);
        return "created";
    }
}

//登录控制器

@Controller
@RequestMapping("")
public class LoginController {

    @RequestMapping(method= {RequestMethod.GET, RequestMethod.POST}, value="/custom_login")
    public String showLogin() {
        return "login";
    }
}

//web。xml

 <web-app>
      <display-name>Archetype Created Web Application</display-name>

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

      <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>

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

      <servlet>
        <servlet-name>terrormovies</servlet-name>
        <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>terrormovies</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    </web-app>

//Spring Security配置:: 应用程序Context-security.xml

<security:http auto-config="true">
        <security:intercept-url pattern="/admin/**/*" access="ROLE_ADMIN" />
        <security:form-login login-page="/custom_login"  username-parameter="user_param" password-parameter="pass_param"/>
    </security:http>
    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user authorities="ROLE_ADMIN" name="admin" password="admin" />
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>

//登录名。jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Terror movies</title>
    </head>
    <body>
        <form action="/j_spring_security_check" method="POST">
        Username<input type="text" name="user_param"/><br/>
        Password<input type="password" name="pass_param"/><br/>
        <input type="submit" value="Login"/>
        </form>
    </body>
    <% if(request.getParameter("error") != null){
            out.println("ERROR LOGIN");
        }
    %>
</html>

当我启动我的应用程序时,我会得到带有表单的登录页面。我分别输入admin/admin作为用户名/密码。当我单击登录按钮时,会出现以下错误页面:

Problem accessing /admin/movies. Reason:

    Request method 'GET' not supported

Powered by Jetty://

而不是转到AdminController中的方法createMovie(@Request estbody String电影)

此错误页的地址为::<代码>http://localhost:8080/admin/movies

LoginController和AdminController位于同一个包中。

我错过了什么?

在表单中操作::<代码>

共有1个答案

楚修为
2023-03-14

您收到的错误响应消息准确地告诉您问题所在:

当我点击登录按钮时,我得到一个错误页面,上面写着:

Problem accessing /admin/movies. Reason:

   Request method 'GET' not supported

Powered by Jetty://

在控制器中,您设置了以下方法:

@Controller
@RequestMapping("/admin")
public class AdminController {

    @RequestMapping(method=RequestMethod.POST, value="/movies")
    @ResponseBody
    public String createMovie(@RequestBody String movie) {
        System.out.println("Adding movie!! "+movie);
        return "created";
    }
}

正如消息所说,/admin/电影方法仅针对POST请求进行映射,因此无法处理从登录成功重定向时生成的GET请求。

所以这里的问题并不是真正的spring-security配置,问题只是在登录后您正在向不支持GET请求映射注释方法发出请求。请求。

要解决此问题,您可以将此方法配置到现有的AdminController中:

@RequestMapping(method=RequestMethod.GET, value="/movies")
public String createMovieForm() {
    return "createMovieForm";
}

并使用指向POST映射控制器方法的表单创建一个jsp:

<form action="/admin/movies" method="POST">
    Movie<input type="text" name="movie"/><br/>
    <input type="submit" value="Login"/>
</form>

如果在POST方法中删除@RequestBody注释,我也会更容易,因此最后的AdminController应该这样结束:

@Controller
@RequestMapping("/admin")
public class AdminController {

    @RequestMapping(method=RequestMethod.POST, value="/movies")
    @ResponseBody
    public String createMovie(String movie) {
        System.out.println("Adding movie!! "+movie);
        return "created";
    }

    @RequestMapping(method=RequestMethod.GET, value="/movies")
    public String createMovieForm() {
        return "createMovieForm";
    }
}

 类似资料:
  • 问题内容: 包括: all Spring libs, Apache Tomcat 7.0 library 在构建路径中 但它仍然给出错误: 在“ org.sprintframework.web-3.1.0.M1.jar”中,我可以看到“ org.springframework.web.context.ContextLoaderListener”。 Google上的某个人说应该包含spring.ja

  • 问题内容: 我使用非常简单的代码返回XML 但是,出现以下错误 请帮忙。谢谢 问题答案: 运行时出现NoSuchMethodError表示你使用的库版本与生成代码所针对的版本不同。 在你的情况下,Spring是元凶。在运行时检查类路径上的内容,并确保以下各项: 版本与编译时间罐相同 如果存在多个版本,请删除不需要的版本

  • 问题内容: 我不明白注释和之间的实际区别是什么? 扩展名还是它们具有完全不同的含义?什么时候应该使用它们?在服务层中使用Spring ,在DAO 中使用javax? 谢谢回答。 问题答案: 几年前,Spring定义了自己的Transactional注释以使Spring bean方法具有事务性。 Java EE 7终于做了同样的事情,现在除了EJB方法外,还允许CDI bean方法是事务性的。因此,

  • 我在CentOS虚拟机中安装了RabbitMQ,该虚拟机的网络适配器被定义为Bridge。我正在尝试配置RabbitMQ管理,以便通过机器的IP地址访问WebApp。配置如下:

  • 这个FAQ的最新版本总是可以从Apache主站点得到,位于<http://httpd.apache.org/docs/2.2/faq/> 如果你的问题在这里没有找到答案,你也可以看看Apache 1.3 FAQ ,看你的问题是否在那里有了答案。 主题 背景 关于 Apache HTTP Server 的背景知识。 支持 我遇到问题该怎么办? 错误信息 这些错误信息是什么意思? 背景 什么是Apac

  • 发布问题 更新问题 设置问题悬赏 获取问题列表 获取一个问题详情 删除一个问题 获取用户发布的问题列表 发布问题 POST /questions 输入 字段 类型 描述 subject 字符串 必须,问题主题或者说标题,不能超过 255 字节 ,必须以 ? 结尾。(不区分全角或者半角) topics 数组 必须,绑定的话题,数组子节点必须符合 { "id": 1 } 的格式。 body 字符串

  • 问题内容: 我简直不敢相信我网站上正在发生的事情。当我添加此行时: 一切正常。如果我不这样做,CSS就会“混乱”,一切都会变得不同,布局也会变得“丑陋”。 这条线如何解决所有问题? 问题答案: 您正在将HTML与XHTML混合使用。 通常,声明用于区分HTMLish语言的版本(在这种情况下为HTML或XHTML)。 不同的标记语言将表现不同。我最喜欢的例子是。在浏览器中查看以下内容: XHTML

  • 我试图在fabric rocket chat上联系,但没有得到太多帮助,因此在SO上发布了它。我有以下疑问: 我们是否可以在链码内访问块高度(我知道这在客户端是可行的,但在链码内是否可能) 可以从链码中的正在进行的事务调用新事务吗? 想知道hyperledger Fabric中存储的数据的历史记录在哪里 我们可以根据链码中的transactionid进行查询吗? 在fabric链码中编写调度程序是