使用spring data JPA实现简单的登陆操作以及登陆拦截

项目总体结构如下

在这里插入图片描述
component下配置了一个登陆拦截器;config下配置接管springMVC添加拦截;controller下:HelloController控制页面访问、跳转,UserController,entity下User实体类对应数据库内的数据表;UserRepository继承数据库访问的接口。前端的那些页面结构就不截了,无关紧要。

JPA操作

application.yaml配置

我的数据库叫“jpa”,先自行建立好,驱动只会建立数据表不会建立数据库。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: 123
    driver-class-name: com.mysql.cj.jdbc.Driver #8.0以上版本的mysql使用这个驱动
  jpa:
    hibernate:
      ddl-auto: update #create是每次创建新表并清空,update是如果有表了就不变了,没有表就创建
    show-sql: true

创建实体类User

省略了import和getter、setter,自行添加。对应了数据库中的"users"表。应用于登陆场合,只要用户名和密码就OK了,然后配上id。

@Entity(name="users")
public class User {
    @Id    //主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)   //自增主键
    private Integer id;
    @Column(name ="name")
    private String name;
    @Column(name ="password")
    private String password;

UserRepository继承接口JpaRepository

因为登陆时要使用用户名到数据库内检索是否有对应用户,所以新建方法findByName(),返回值类型为User,到时候可以使用user.getPassword()来获取检索的密码,并与提交的密码进行比对,相等则登陆成功,不等则失败。

public interface UserRepository extends JpaRepository<User,Long> {
    public User  findByName(String name);
}

UserController

登陆页会将表单提交至"/check",在selectOne方法内进行判断,成功则跳转至主页, 并在session中添加内容用以判断是否登陆,用于后续的登陆拦截——未登录则拦截;失败则返回“login”,并注入失败信息,继续填写用户名密码。

@Controller
public class UserController {
    @Autowired
    UserRepository userRepository;

    @RequestMapping("/all")
    public List<User> selectAll(){
        List<User> userList=userRepository.findAll();
        String str= JSON.toJSON(userList).toString();
        return userList;
    }
    @PostMapping(value = "/check")
    public String selectOne(@RequestParam("name") String name, @RequestParam("password") String password, HttpSession session, Map<String,Object> map){
        User user = userRepository.findByName(name);
        if (user==null){
            map.put("msg","用户名不存在");
            System.out.println(110);
            return "login";
        }
        String pwd = user.getPassword();
        if (pwd.equals(password)) {
            session.setAttribute("loginUser", name);
            return "index";
        }
        else{
            map.put("msg","用户名密码错误");
            System.out.println(111);
            return "login";
        }
    }
}

登陆失败的截图如下:
在这里插入图片描述
登陆页使用的bootstrap的example,可以去官网自提。表单处的代码略有修改,主要是给两个“input”添加了name属性,不然post出去得不到数据;以及加了一个p标签,提示用户名、密码出错。

   <form class="form-signin" action="/check" method="post">
  <img class="mb-4" src="/bootstrap-solid.svg" alt="" width="72" height="72">
  <h1 class="h3 mb-3 font-weight-normal">请登录</h1>
        <p style="color:red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}" ></p>

  <label for="inputEmail" class="sr-only">用户名</label>
  <input type="text" name="name" id="inputEmail" class="form-control" placeholder="用户名" required="" autofocus="">
  <label for="inputPassword" class="sr-only">密码</label>
  <input type="password"  name="password" id="inputPassword" class="form-control" placeholder="密码" required="">
  <div class="checkbox mb-3">
    <label>
      <input type="checkbox" value="remember-me"> Remember me
    </label>
  </div>
  <button class="btn btn-lg btn-primary btn-block" type="submit">登陆</button>
  <p class="mt-5 mb-3 text-muted">© 2017-2019</p>
</form>

登陆拦截

添加拦截器component.LoginInterceptor

实现接口HandlerInterceptor,判断session是否有注入内容,如果没有,则表示没有登陆,那么拦截请求并返回login页。

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("loginUser");
        if(user==null){
            request.setAttribute("msg","没有权限");
            request.getRequestDispatcher("/login").forward(request,response);
            return false;
        }
        else
            return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

springmvc配置,添加拦截器(MyMvcConfig)

spring boot2.0后WebMvcAutoConfigurationAdapter被弃用,所以继承WebMvcConfigurationSupport这个类。拦截所有请求,除了"/login"和"/check"。

@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login","/check","/static/*");
        super.addInterceptors(registry);
    }
}

补一个小问题:中间有一次运行时一直找不到我的如CSS等静态文件,报错如下:
在这里插入图片描述
搞了很久,重启啊、改配置啊几乎都试过了,没用。最后把@Configuration注释了运行了一次,再取消注释运行就OK了,但不知道为什么。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值