⼿把⼿教你⽤Java实现⼀套简单的鉴权服务
⽬录
前⾔
⼀、何为鉴权服务
⼆、利⽤servlet+jdbc实现简单的⽤户登录程序
1.明确思路
2.⼿把⼿教你实现⼀个简单的web登录程序
三、回顾
1.密码未加密裸奔
2.登录信息未存储
3.对于其他资源并未进⾏权限管理ssm框架实现登录功能
四、优化设计
1.密码加密存储
2.存储登录信息
3.对资源进⾏管理
五、关于鉴权问题
1.Cookie/Session机制
2.⽤Cookie/Session解决鉴权问题?
3.使⽤token机制解决鉴权问题
六、⽤SpringBoot+SSM实现⼀套简单的鉴权服务(注册,登录,权限控制)
1.注册服务
2.登录服务
3.权限控制()
七、效果展⽰
1.注册
2.登录
3.访问其他资源
写在最后
前⾔
时遇JavaEE作业,题⽬要求写个简单web登录程序,按照⽼师的意思是⽤servlet、jsp和jdbc完成。本着要么不做,要做就要做好的原则,我开始着⼿完成此次作业(其实也是写实训作业的⽤户鉴权部分),⽽之前写项⽬的时候也有相关经验,这次正好能派上⽤场。
⼀、何为鉴权服务
引⽤百度百科的话说
鉴权(authentication)是指验证⽤户是否拥有访问系统的权利。
鉴权包括两个⽅⾯:
⽤户鉴权,⽹络对⽤户进⾏鉴权,防⽌⾮法⽤户占⽤⽹络资源。
⽹络鉴权,⽤户对⽹络进⾏鉴权,防⽌⽤户接⼊了⾮法的⽹络,被骗取关键信息。
⽽我们这⾥的鉴权主要指⽤户鉴权,即如何确认“你是你”。最简单的体现便是平常⽤的⽤户登录登出。
现今⼤部分系统都会有⾃⼰的鉴权服务,它是⽤户与系统交互的第⼀步,系统需要⼀系列步骤明⽩你是谁,你可以做哪些事,明⽩了这些之后它才能更好的服务于你。
⼆、利⽤servlet+jdbc实现简单的⽤户登录程序
1.明确思路
⾸先,我们要仔细思考⼀下我们到底需要什么?
先让我们回想⼀下⼀般的登录是如何做的呢?
对于⽹页,⾸先会出现⼀个登录页⾯,然后呢,输⼊账号密码,点击登录,就会弹出成功/失败的页⾯。
那如何去判断成功/失败呢?
思考⼀下,最简单的⽅法便是拿到前端传来的数据之后便将其拿到数据中去查,看看密码是不是⼀样,然后给前端回复说——我到了,他就是XXX或者我不到他的记录,让他重新输⼊账号密码。然后前端对此回复做出相应的操作,⽐如登录成功便跳转到⾸页,失败让⽤户重新输⼊。
2.⼿把⼿教你实现⼀个简单的web登录程序
出于某些原因,我这⾥⼿把⼿教你如何实现⼀个简单的web登录程序。
①创建web项⽬
打开idea,新建⼀个web项⽬
这⾥为了⽅便jar包的管理,选择maven结构的项⽬(⾄于什么是maven结构,不懂的可以百度,了解概念即可),然后选择从原型创建,选择webapp(这⾥只是⽅便,你也可以选择空项⽬,不过会费点时间)。
点击下⼀步,输⼊项⽬名称
这⾥选择相应的maven,idea⾥有⾃带的maven和jar包仓库,不过我是⾃⼰去官⽹下了⼀个(不下也完全可以)。
选择完成,这样⼀个最简单的项⽬结构就出来了。
接下来需要配置⼀下l,因为要⽤到jdbc和tomcat的jar包(毕竟都是调⽤⼈家的接⼝(笑哭))
<dependencies>
<dependency>
<groupId>at.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.37</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
</dependencies>
(加在project标签⾥就⾏),上⾯配置的意思就是导⼊两个第三⽅⼯具包
②编写简单的登录页⾯
这⾥我既想要好看,⼜想偷懒,所以⽤了layui框架的模板
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>后台管理-登陆</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="stylesheet" href="../lib/layui-v2.6.3/css/layui.css" media="all">
<!--[if lt IE 9]>
<script src="/html5shiv/r29/html5.min.js"></script>
<script src="/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<style>
.main-body {top:50%;left:50%;position:absolute;-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);overflow:hidden;}
.login-main .login-bottom .center .item input {display:inline-block;width:227px;height:22px;padding:0;position:absolute;border:0;outline:0;font-size:14px;letter-spacing:0;}
.login-main .login-bottom .center .item .icon-1 {background:url(../images/icon-login.png) no-repeat 1px 0;}
.login-main .login-bottom .center .item .icon-2 {background:url(../images/icon-login.png) no-repeat -54px 0;}
.login-main .login-bottom .center .item .icon-3 {background:url(../images/icon-login.png) no-repeat -106px 0;}
.login-main .login-bottom .center .item .icon-4 {background:url(../images/icon-login.png) no-repeat 0 -4
3px;position:absolute;right:-10px;cursor:pointer;}
.login-main .login-bottom .center .item .icon-5 {background:url(../images/icon-login.png) no-repeat -55px -43px;}
.login-main .login-bottom .center .item .icon-6 {background:url(../images/icon-login.png) no-repeat 0 -93px;position:absolute;right:-10px;margin-top:8px;cursor:pointer;}
.login-main .login-bottom .tip .icon-nocheck {display:inline-block;width:10px;height:10px;border-radius:2px;border:solid 1px #9abcda;position:relative;top:2px;margin:1px 8px 1px 1px;cursor:pointer;}
.login-main .login-bottom .tip .icon-check {margin:0 7px 0 0;width:14px;height:14px;border:none;background:url(../images/icon-login.png) no-repeat -111px -48px;}
.login-main .login-bottom .center .item .icon {display:inline-block;width:33px;height:22px;}
.login-main .login-bottom .center .item {width:288px;height:35px;border-bottom:1px solid #dae1e6;margin-bottom:35px;}
.login-main {width:428px;position:relative;float:left;}
.login-main .login-top {height:117px;background-color:#148be4;border-radius:12px 12px 0 0;font-family:SourceHanSansCN-Regular;font-size:30px;font-weight:400;font-stretch:normal;letter-spacing:0;color:#fff;line-height:117px;text-align:center;overflow:hidde        .login-main .login-top .bg1 {display:inline-block;width:74px;height:74px;background:#fff;opacity:.1;border-radius:0 74px 0 0;position:absolute;left:0;top:43px;}
.login-main .login-top .bg2 {display:inline-block;width:94px;height:94px;background:#fff;opacity:.1;border-radius:50%;position:absolute;right:-16px;top:-16px;}
.login-main .login-bottom {width:428px;background:#fff;border-radius:0 0 12px 12px;padding-bottom:53px;}
.login-main .login-bottom .center {width:288px;margin:0 auto;padding-top:40px;padding-bottom:15px;position:relative;}
.login-main .login-bottom .tip {clear:both;height:16px;line-height:16px;width:288px;margin:0 auto;}
body {background:url(../images/loginbg.png) 0% 0% / cover no-repeat;position:static;font-size:12px;}
input::-webkit-input-placeholder {color:#a6aebf;}
input::-moz-placeholder {/* Mozilla Firefox 19+ */            color:#a6aebf;}
input:-moz-placeholder {/* Mozilla Firefox 4 to 18 */            color:#a6aebf;}
input:-ms-input-placeholder {/* Internet Explorer 10-11 */            color:#a6aebf;}
input:-webkit-autofill {/* 取消Chrome记住密码的背景颜⾊ */            -webkit-box-shadow:0 0 0 1000px white inset !important;}
html {height:100%;}
.login-main .login-bottom .tip {clear:both;height:16px;line-height:16px;width:288px;margin:0 auto;}
.login-main .login-bottom .tip .login-tip {font-family:MicrosoftYaHei;font-size:12px;font-weight:400;font-stretch:normal;letter-spacing:0;color:#9abcda;cursor:pointer;}
.login-main .login-bottom .tip .forget-password {font-stretch:normal;letter-spacing:0;color:#1391ff;text-decoration:none;position:absolute;right:62px;}
.
login-main .login-bottom .login-btn {width:288px;height:40px;background-color:#1E9FFF;border-radius:16px;margin:24px auto 0;text-align:center;line-height:40px;color:#fff;font-size:14px;letter-spacing:0;cursor:pointer;border:none;}
.login-main .login-bottom .center .item .validateImg {position:absolute;right:1px;cursor:pointer;height:36px;border:1px solid #e6e6e6;}
.footer {left:0;bottom:0;color:#fff;width:100%;position:absolute;text-align:center;line-height:30px;padding-bottom:10px;text-shadow:#000 0.1em 0.1em 0.1em;font-size:14px;}
.padding-5 {padding:5px !important;}
.footer a,.footer span {color:#fff;}
@media screen and (max-width:428px) {.login-main {width:360px !important;}
.login-main .login-top {width:360px !important;}
.login-main .login-bottom {width:360px !important;}
}
</style>
</head>
<body>
<div class="main-body">
<div class="login-main">
<div class="login-top">
<span>LayuiMini后台登录</span>
<span class="bg1"></span>
<span class="bg2"></span>
</div>
<form class="layui-form login-bottom" action="/login" method="post">
<div class="center">
<div class="item">
<span class="icon icon-2"></span>
<input type="text" name="uname" lay-verify="required"  placeholder="请输⼊登录账号" maxlength="24"/>
</div>
<div class="item">
<span class="icon icon-3"></span>
<input type="password" name="pwd" lay-verify="required"  placeholder="请输⼊密码" maxlength="20">
<span class="bind-password icon icon-4"></span>
</div>
</div>
<div class="tip">
<span class="icon-nocheck"></span>
<span class="login-tip">保持登录</span>
<a href="javascript:" class="forget-password">忘记密码?</a>
</div>
<div class="layui-form-item" >
<button class="login-btn" type="submit" lay-submit="" lay-filter="login">⽴即登录</button>
</div>
</form>
</div>
</div>
<div class="footer">
©版权所有 2014-2018 叁贰柒⼯作室<span class="padding-5">|</span><a target="_blank" href="v">粤ICP备16006642号-2</a>
</div>
<script src="../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
//原本想⽤json的post发送,结果发现后端数据得⾃⼰解析,为了降低难度,直接⽤form表单的post提交,这样后端直接拿数据即可(不然还得解析Json数据)
// layui.use(['form','jquery'], function () {
//    var $ = layui.jquery,
//        form = layui.form,
//        layer = layui.layer;
//
//    // 登录过期的时候,跳出ifram框架
//    if (top.location != self.location) top.location = self.location;
//
//    $('.bind-password').on('click', function () {
//        if ($(this).hasClass('icon-5')) {
//            $(this).removeClass('icon-5');
//            $("input[name='pwd']").attr('type', 'password');
//        } else {
//            $(this).addClass('icon-5');
/
/            $("input[name='pwd']").attr('type', 'text');
//        }
//    });
//
//    $('.icon-nocheck').on('click', function () {
//        if ($(this).hasClass('icon-check')) {
//            $(this).removeClass('icon-check');
//        } else {
//            $(this).addClass('icon-check');
//        }
//    });
/
/
//    // 进⾏登录操作
//    ('submit(login)', function (data) {
//        data = data.field;
//        if (data.uname == '') {
//            layer.msg('⽤户名不能为空');
//            return false;
//        }
//        if (data.pwd == '') {
//            layer.msg('密码不能为空');
//            return false;
/
/        }
//        $.ajax({
//            url:'/login',
//            method:'post',
//            data:data,
//            dataType:'JSON',
//            success:function(res){
//                if (res.msg==='登录成功'){
//                    layer.msg('登录成功', function () {
//                        window.location = '../index.html';
//                    });
/
/                }else {
//                    layer.msg("登录失败");
//                }
//            },
//            error:function (data) {
//            }
//        }) ;
//
//
//        return false;
//    });
/
/ });
</script>
</body>
</html>
当然以上代码有⼀部分注释掉了,原因是如果⽤JSON格式发送post请求,后端的servlet(准确的说是Tomcat的解析)并没有帮我们解析封装这部分数据,所以我们⽆法直接get到,得⾃⼰另外解析数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。