Spring Security使用总结四,此篇没有任何营养,就是将注册服务补全

这可以说是准备工作的最后一道程序,就是将用户注册到系统中去,这一章内容很简单,就是使用springboot的jpa将前台传到后台的用户注册到数据库中,所以这一章的代码多,但是都是套路,前面的也是套路,但是没有这次的套路深。

首先创建一个类,用来接收前台传进来的信息

java 复制代码
import lombok.Data;
@Data
public class RegisterDTO {
    private String name;
    private String password;
    private String confirmPassword;
}

然后需要依赖fastjson作为服务的返回值

XML 复制代码
<!--fastjson依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version> 2.0.32</version>
</dependency>

再创建存入数据库的表

java 复制代码
import lombok.Data;
import lombok.experimental.Accessors;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name="user_info")
@Accessors(chain = true)
@Data
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 用户Id
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    /**
     * 用户名
     */
    @Column(nullable = false,unique = true)
    private String name;
    /**
     * 密码
     */
    @Column(nullable = false,unique = true)
    private String password;
}

添加仓储类和服务类以及对外的接口

java 复制代码
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.zcrazy.security.entity.User;

@Repository
public interface UserRepository extends JpaRepository<User,Long> {}
java 复制代码
import com.alibaba.fastjson.JSONObject;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.zcrazy.security.entity.User;
import org.zcrazy.security.repository.UserRepository;
@Service
public class RegisterService {
    @Resource
    UserRepository userRepository;
    public JSONObject register(String name, String password){
        User user = new User();
        user.setName(name).setPassword(password);
        userRepository.save(user);
        return JSONObject.parseObject("{'userId':"+ userRepository.save(user).getId() +"}");
    }
}
java 复制代码
import com.alibaba.fastjson.JSONObject;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.zcrazy.security.dto.RegisterDTO;
import org.zcrazy.security.service.RegisterService;
@Controller
public class RegisterController {
    @Resource
    RegisterService registerService;
    @RequestMapping("/register")
    public String register(){
        return "register";
    }
    @ResponseBody
    @PostMapping("/registration")
    public JSONObject registration(@RequestBody RegisterDTO register){
        if(!register.getPassword().equals(register.getConfirmPassword())){
            return JSONObject.parseObject("两次密码不一致");
        }
        return registerService.register(register.getName(),register.getPassword());
    }
}

前台也必须要有向后台传数据的代码,修改前台如下所示:

在注册按钮上加入点击事件

html 复制代码
<button id="register" type="submit" onclick="click()" class="btn btn-success">注册</button>

添加如下的js片段

javascript 复制代码
<script type="text/javascript">
    $(function() {
        $("#register").click(function(){
            $.ajax({
                type: "POST",
                dataType: "json",
                url: 'http://localhost:8080/registration',
                contentType: "application/json",
                data:JSON.stringify({
                    "name": $("#name").val(),
                    "password": $("#password").val(),
                    "confirmPassword":$("#confirmPassword").val()
                }),
                success: function (result) {
                    console.log("data is :" + result)
                }
            });
        })
    });
</script>

这个时候启动项目,访问http://localhost:8080/register ,填入信息,我填的是用户名:test11,密码:123456,然后点击注册,页面来说什么反应都没有,访问http://localhost:8080/h2-console,查看数据库发现也没有数据,什么情况呢?原来security的配置里面没有将/registration服务设为所有人都可以访问的服务,于是就需要在配置类里面修改代码为如下所示:

java 复制代码
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter  {
   //...省略的代码
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //关闭csrf
                .csrf().disable()
                .authorizeRequests()
                .antMatchers(new String[]{"/register", "/registration"}).permitAll()
                .antMatchers(matchers).anonymous()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated()
                .and()
                //允许加载静态资源
                .headers().frameOptions().sameOrigin();
    }
    //...省略的代码
}

重启项目,访问http://localhost:8080/register ,填入信息,点击注册,访问http://localhost:8080/h2-console,进入数据库,输入查询语句,可以看到已经注册成功了。

此时项目的文件结构如下所示

和上一章对比来看,多了很多的内容,但说白了就是多了保存数据的内容,一个service,一个Repository,一个entity,一个DTO

相关推荐
Leighteen几秒前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
峥无15 分钟前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波26 分钟前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
名字还没想好☜43 分钟前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
圆山猫1 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao1 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
史呆芬2 小时前
分布式事务实战:微服务跨服务数据一致性解决方案
java·后端·spring cloud
IT界的老黄牛2 小时前
限流命中后该怎么办:直接丢、阻塞等待、延迟重投三种姿势的取舍
java·rocketmq·redisson·令牌桶·削峰·分布式限流
早睡早起身体好1232 小时前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
daad7773 小时前
记录matlab状态机demo
java·网络·matlab