Spring MVC使用 spring security来实现登录(无数据库)Gradle/Spring

本文档详述了一位开发者如何使用Spring+Gradle搭建一个Web应用,包括添加相关依赖、配置Spring Security以及处理JSON数据。开发者分享了创建项目、配置拦截器、设置过滤器链、建立Controller和视图解析器的过程,并提供了关键代码片段。此外,还涉及了Spring Security的配置以及登录验证的实现,最后展示了项目运行的效果。

做了大概一天半吧,才终于做出来,还是小有成就的(PS:还是有点笨的,多多见谅)

两份代码均会分享给大家,但是还是希望大家可以看完我的啰嗦哈

项目呢分为俩种,
第一种是Spring +pom
第二种是Spring+Gradle

本人做的是Spring+Gradle的就拿这个给大家介绍了

1.首先需要创建一个Gradle的项目
项目构建

在这里插入图片描述
完成之后进入就是这样
在这里插入图片描述
其他所需的一些依赖

//导入“spring-webmvvc”  “spring-context”  “js tl-api”
    compile group: 'org.springframework', name: 'spring-webmvc', version: '5.0.4.RELEASE'
    compile group: 'org.springframework', name: 'spring-context', version: '5.0.5.RELEASE'
    compile group: 'javax.servlet.jsp.jstl', name: 'jstl-api', version: '1.2'
    /*jstl标签支持支持*/
    // https://mvnrepository.com/artifact/jstl/jstl
    implementation group: 'jstl', name: 'jstl', version: '1.2'
    /*-----------需要对结果的json解析在这里引入了三个所需核心架包---------------*/
    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.13.1'
    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.1'

    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.13.1'

    /*security需要专门的标签支持*/
    // https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs
    implementation group: 'org.springframework.security', name: 'spring-security-taglibs', version: '5.6.1'

    /*---------------这里是spring-security的页面权限控制所需要的架包---------------------*/
    // https://mvnrepository.com/artifact/org.springframework.security/spring-security-web
    implementation group: 'org.springframework.security', name: 'spring-security-web', version: '5.6.1'

    // https://mvnrepository.com/artifact/org.springframework.security/spring-security-config
    implementation group: 'org.springframework.security', name: 'spring-security-config', version: '5.6.1'

    /*---------------security的核心架包----------------------*/
    // https://mvnrepository.com/artifact/org.springframework.security/spring-security-core
    implementation group: 'org.springframework.security', name: 'spring-security-core', version: '5.6.1'

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是选择完之后的,注意先别急着点击OK,还需要把刚刚复制的
\WEB-INF\web.xml粘贴到webapp后面,即可点击OK
在这里插入图片描述
这样就OK了,然后就可以继续了
在这里插入图片描述这就是完成之后的样子,你需要建立自己的包和Controller以及jsp,这里我就一起建立了
然后你需要到在resource中进行新建俩个XML
在这里插入图片描述
目录结构如下所示
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
完成上面之后,在web.xml会出现以下拦截器
这个是
Spring Security过滤器链,注意过滤器名称必须是springSecurityFilterChain

“Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。网页上的某些操作或数据只有用户登录之后才能访问,可以用filter来过滤掉未登录的用户,只让已经登录的用户继续访问。”

在这里插入图片描述
光有这些还是不够的,我们需要配置以下

    <servlet>
        <servlet-name>SpringMvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-*.xml</param-value>
        </init-param>
        <!-- 表示容器再启动时立即加载servlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

在这里插入图片描述
下面是resource下的spring-servlet.xml的配置文件

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 注解驱动配置 -->
    <mvc:annotation-driven />
    <!--包扫描-->
    <context:component-scan base-package="com.controller"/>
    <!-- 对静态资源放行 -->
    <mvc:default-servlet-handler />

    <!--  ResourceViewResolver视图解析器  -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--设置前缀    前缀"/"开头不要忘记,否则url路径有问题-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--设置后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list >
                <ref bean="mappingJacksonHttpMessageConverter" />
            </list>
        </property>
    </bean>
    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
</beans>

下面是resource下的spring-security.xml的配置文件
里面的东西需要根据自己项目的进行更改,不会的百度查一下即可,我这里就不多啰嗦里面的文档内容(主要是我也不太理解,怕误导各位)

<?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:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security.xsd">

    <!-- 10. Spring security认证权限配置-->
    <!-- ================ Spring security start ================ -->

    <!--从下面的代码中,我们可以看出配置的详细信息:登录页面自定义为 login.jsp、
    登录页面提交的 url 为 /admin/login、登录时使用的用户名对应着 login.jsp
    页面中登录表单的 username 属性、登录时使用的密码对应着 login.jsp
    页面中登录表单的 password 属性。登录失败时自动跳转到 err0.jsp,
    登录成功时自动跳转到 success.jsp。

   需要注意的是:
   我们在 intercept-url 中定义了所有路径的请求都需要 ROLE_USER 权限,
   这就意味着我们自定义的 /login.jsp、/failer.jsp
   也 需要该权限,这样就会形成了一个死循环。解决办法就是给 /login.jsp和 /fail.jsp 放行。

-->
    <!-- 配置不拦截的资源 -->
    <security:http pattern="/login.jsp" security="none"/>
    <security:http pattern="/fail.jsp" security="none"/>


    <!--< !&#45;&#45; 第一种方法,可以用 default-target-url 作为一个controller 来跳转.比较简单 &ndash;&gt;-->
    <!--  <http auto-config=""true"">
      <intercept-url pattern=""/app/welcome*"" access=""ROLE_USER"">
      <intercept-url pattern=""/app/admin*"" access=""ROLE_ADMIN"">


      <form-login login-page=""/app/login""
      default-target-url=""/app/dispatch""
      authentication-failure-url=""/app/loginfailed"">
      <logout logout-success-url=""/app/logout"">
  </logout>
        </form-login></intercept-url></intercept-url></http>-->
    <!-- 第一种方法结束 -->



    <security:http auto-config="true" use-expressions="false">
        <security:intercept-url pattern="/user" access="ROLE_USER" />
        <security:intercept-url pattern="/**" access="ROLE_ADMIN" />


        <security:form-login login-page="/login.jsp"
                             login-processing-url="/login"
                             username-parameter="username"
                             password-parameter="password"
                             authentication-failure-url="/fail.jsp"
                             authentication-success-forward-url="/index.jsp"/>

        <!-- 必须配置,否则自定义登录页/login.jsp提交login会有403错误 -->
        <security:csrf disabled="true"/>
    </security:http>

    <!-- 关闭跨域请求 -->
    <!-- <security:csrf disabled="true"/>-->

    <!-- 3).模拟用户(测试,不用连接数据库),设置spring security认证用户信息的来源 -->
    <!--
    springsecurity默认的认证必须加密,加上{noop}表示不加密认证
     -->

    <bean id="webexpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" />

    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="user" password="{noop}123456" authorities="ROLE_USER"/>
                <security:user name="admin" password="{noop}111222" authorities="ROLE_ADMIN"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>

</beans>

这里提一个知识点哈
也是自己之前一直写但是一直也没注意的一个知识点分享给大家
如果要是用JSON格式往前端传值的话,那么你就应该使用
( @Controller和@ResponseBody )或者@RestController

那么这个RestController中呢包含了Controller和ResponseBody这两个注解
那么像MVC项目,不需要JSON前后端传值的话,那么就用Controller即可
如果你写了一个jquery的方法想要用js来传值的话,那么你就需要要RestController这个注解来实现

言归正传哈,继续往下走
这是Controller中的内容

@Controller
public class FirstController {
    
    @RequestMapping(value = "/hello" ,method = RequestMethod.POST)
    public ModelAndView hello(){
        ModelAndView mv =new ModelAndView();
        SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
        Date date = new Date(System.currentTimeMillis());
        String message ="Hello world @ " +formatter.format(date);
        mv.setViewName("/loginIn");
        mv.addObject("msg",message);
        return mv;
    }
}

index.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>首页登录</title>
  </head>
  <body>
  <div style="align-content: center">
    <form action="${pageContext.request.contextPath}/hello" method="post">
    <input type="submit" value="进入首页"/>
    </form>
  </div>
  </body>
</html>

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<style>
  html{
    width: 100%;
    height: 100%;
    overflow: hidden;
    font-style: initial;
  }
  body{
    width: 100%;
    height: 100%;
    font-family: 'Open Sans',sans-serif;
    margin: 0;
    background-color: darkseagreen;
  }
  #login{
    position: absolute;
    top: 50%;
    left:50%;
    margin: -150px 0 0 -150px;
    width: 300px;
    height: 300px;
  }
  #login h1{
    color: #fff;
    text-shadow:0 0 10px;
    letter-spacing: 1px;
    text-align: center;
  }
  h1{
    font-size: 2em;
    margin: 0.67em 0;
  }
  input{
    width: 278px;
    height: 18px;
    margin-bottom: 10px;
    outline: none;
    padding: 10px;
    font-size: 13px;
    color: #fff;
    text-shadow:1px 1px 1px;
    border-top: 1px solid #312E3D;
    border-left: 1px solid #312E3D;
    border-right: 1px solid #312E3D;
    border-bottom: 1px solid #56536A;
    border-radius: 4px;
    background-color: #2D2D3F;
  }
  .but{
    width: 277px;
    min-height: 20px;
    display: block;
    background-color: #4a77d4;
    border: 1px solid #3762bc;
    color: #fff;
    padding: 9px 14px;
    font-size: 15px;
    line-height: normal;
    border-radius: 5px;
    margin: 0;
  }
</style>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <title>登录界面</title>
  </head>
  <body>
  <div id="login">
    <h1>Login</h1>
      <form action="login" method="post"  >
      <input type="text" required="required" placeholder="用户名" name="username" />
      <input type="password" required="required" placeholder="密码" name="password"/>
      <button class="but" type="submit">登录</button>
        <div style="padding: 10px 20px"></div>
      <button class="but" type="reset">重置</button>
    </form>
  </div>
  </body>
</html>

fail.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <div style="align-content: center">
      登陆失败请重新登录<br/>
      返回登录请点击<a href="${pageContext.request.contextPath}/login.jsp">这里</a>
  </div>
  </body>
</html>

loginIn.jsp 注意(这个jsp是放到了WEB-INF/jsp中哈)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix='security' uri='http://www.springframework.org/security/tags'%>
<html>
<head>
    <title>简单应答</title>

</head>
<body style="text-align: center">

    <h2> 当前登录用户:<security:authentication property="principal.username"></security:authentication></h2>
        <span>${msg}</span>
    <h2><a href="${pageContext.request.contextPath}/login.jsp">登陆页面</a></h2>
</body>
</html>

配置Tomcat
在这里插入图片描述
在这里插入图片描述
懒得用Ps了,凑合看吧,
在这里插入图片描述
点击OK
在这里插入图片描述
首页效果图
在这里插入图片描述
在这里插入图片描述
这样就好啦,项目代码地址:

Gradle

提取码:zhdu
a2rq

Spring

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值