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

Spring security-资源j_spring_security_check不可用

陈增
2023-03-14

我正在尝试构建一个基于Spring的web应用程序,我想从配置一个基于存储在数据库表中的用户名和密码元组的简单身份验证系统开始。

我的理解是,使用Spring security可以很容易地实现这一点,但我无法使其工作。

下面是我的web.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <servlet>
        <servlet-name>Servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/Servlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

跟随servlet-context.xml文件。bob和sam用户用于测试目的。在我得到这个权利之后,我将切换到一个基于JDBC的用户服务。

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:sec="http://www.springframework.org/schema/security"
    xsi:schemaLocation="
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        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
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <sec:http use-expressions="true">
        <sec:intercept-url pattern="/**" access="permitAll" />
        <sec:form-login
            login-page="/home.html"
            login-processing-url="/j_spring_security_check"
            authentication-failure-url="/login-error.html"
            default-target-url="/welcome.html" />
        <sec:logout logout-success-url="/home.html" />
    </sec:http>

    <sec:authentication-manager>
        <sec:authentication-provider>
            <sec:password-encoder hash="md5"/>
            <sec:user-service>
                <sec:user name="bob" password="12b141f35d58b8b3a46eea65e6ac179e" authorities="ROLE_SUPERVISOR, ROLE_USER" />
                <sec:user name="sam" password="d1a5e26d0558c455d386085fad77d427" authorities="ROLE_USER" />
            </sec:user-service>
        </sec:authentication-provider>
    </sec:authentication-manager>

    <context:component-scan base-package="cz.dusanrychnovsky.whattoreadnext" />
    <mvc:annotation-driven />
</beans>
@Controller
public class HomeController 
{   
    @RequestMapping(value = "/home.html")
    public String home() {
        return "home";
    }

    @RequestMapping(value = "/login-error.html")
    public String loginError(Model model) {
        model.addAttribute("loginError", true);
        return "home";
    }
}
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-3.dtd">
<html 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:th="http://www.thymeleaf.org">

    <head>
        <title>Contacts</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
        <div id="content">
            <h1>Welcome to the site!</h1>

            <p th:if="${loginError}">Wrong user or password</p> 
            <form th:action="@{/j_spring_security_check}" method="post"> 
                <label for="j_username">Email address</label>: 
                <input type="text" id="j_username" name="j_username" /> <br /> 
                <label for="j_password">Password</label>: 
                <input type="password" id="j_password" name="j_password" /> <br /> 
                <input type="submit" value="Log in" /> 
             </form>
        </div>
    </body>
</html>

当我将WAR文件部署到本地Tomcat安装并访问http://localhost:8080/test/home.htmlURL时,主页会正常打开。但是,当我填写提交给http://localhost:8080/test/j_spring_security_check的表单时,我得到一个404-请求的资源()不可用。错误。

我做错了什么?请原谅我,因为我是Spring MVC/Security和Thymeleaf的新手。

共有1个答案

有凯泽
2023-03-14

>

  • 您需要在web.xml中配置Spring Security过滤器

    您不能在servlet-context.xml中配置Spring Security性,因为servlet-context.xml属于特定的DispatcherServlet,但是Spring Security filter在请求到达任何Servlet之前工作。

    您需要使用ContextLoaderListener创建根应用程序上下文,并将Spring Security配置放在那里。

    实际上,只要您不需要单独的servlet-context.xmlapplicationcontext.xml,我建议您将所有东西从servlet-context.xml移到applicationcontext.xml中,并将servlet-context.xml保留为空(即,将其 元素保留为空)。

  •  类似资料:
    • 我将Spring Security从2升级为3 以前的security.xml具有AuthenticationProcessingFilter和AuthenticationProcessingFilterEntryPoint

    • 我正在尝试编写我的第一个JSF应用程序,但在Apache Tomcat 8.0/GlassFish 4服务器上部署它时遇到了问题。 例如,我使用了Horstmann的Core Java Server Faces中描述的应用程序(它来自这里的源代码ch01)。根据这本书,我应该做(对于Win 7 x64): < li >从路径ch01/login/src/java使用以下命令行命令编译项目: 如果使

    • 我在C中使用tcp套接字服务器和客户端。使用AF_INET、SOCK_STREAM和IPPROTO_TCP 在sock send()命令上有一个可能导致“资源暂时不可用”的帖子,其中Davide Berra说 这是因为您使用的是非阻塞套接字,并且输出缓冲区已满。 从send()手册页

    • 我试图在一个带有spring security和KeyClope的java应用程序中同时使用领域和资源角色。不幸的是,KeyClope只会返回一个或另一个,具体取决于: 您仍然可以通过自定义代码获得这两种方法,但它会弄乱@PreAuthorize或spring boot方法等注释。isUserInRole,这会导致难看的代码。 有没有办法覆盖@PreAuthorize方法或JSON令牌Keyclo

    • 我在使用MyEclipse IDE中的Tomcat服务器和Struts 2框架时遇到了一个反复出现的问题。我正在运行我的程序作为一个服务器应用程序,当它运行时,默认的index.jsp文件将成功打开,但该应用程序的其他过去都将无法工作。当试图加载任何我的。do页面,我得到以下错误:HTTP状态404:请求的资源....不可用。当我以前遇到这个错误时,我只是重启了服务器,一切都很好,但是我现在没有同