JavaWeb 基于Session的用户登陆注销实现

  通过Session来存储用户的部分登陆信息来验证用户是否在线,这应该时最容易实现的一种Web端方案,本文以SSM(Spring、SpringMVC、myBatis)框架为载体,来具体实现这套登陆系统。

  1.通过前端传递用户名密码到后端接口,接口拿到值后,对其进行MD5加密,与数据库中的字段进行比较,返回状态给前端,前端根据返回值进行页面跳转。

  MD5加密工具类

public String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{
        //确定计算方法
        MessageDigest md5=MessageDigest.getInstance("MD5");
        BASE64Encoder base64en = new BASE64Encoder();
        //加密后的字符串
        String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));
        return newstr;
    }

   DAO层以及Mapper

<select id="valiteUser" parameterType="java.lang.String" resultType="com.heitian.ssm.model.Userinfo">
        SELECT password FROM t_user
        WHERE username = #{username}
</select>

 Service层实现类

public String valiteUser(Userinfo userinfo) {
        try{
            Userinfo userdemo=userDao.valiteUser(EncoderByMd5(userinfo.getUsername()));
            if(userinfo.getPassword().equals(userdemo.getPassword())){
               return "pass";
            }
        }catch (Exception e){
            e.printStackTrace();
            return "error";
        }
        return "refuse";
    }

Controller层

    @ResponseBody
    @RequestMapping("/loginUser")
    public HashMap<String,Object> loginUser(HttpServletRequest request, Userinfo userinfo){
        HashMap<String,Object> result=new HashMap<String, Object>();
        HttpSession session = request.getSession();
        System.out.println("login fail");
        String status=userService.valiteUser(userinfo);
        if(status.equals("pass")){
            session.setAttribute("CURRENT_USER",userinfo.getUsername());
            result.put("status","pass");
        }else{
            if(status.equals("refuse")){
                result.put("status","refuse");
            }else {
                result.put("status","error");
            }
        }
        return result;
    }

通过返回status信息,来判断登陆是否成功,如果成功则将Session中写入用户名键值对。

  2.当其他页面访问时,如何判断是否有用户登陆在线呢,我通过JS来取Session值来判断。

    即:先去拿Session的值,如果拿到为空或为null,则说明此会话在此之前没有登陆行为,我们自动将其重定向到首页,如果有值,则说明有登陆行为,且登陆在线的用户为CURRENT_USER

所取出来的值,这时我们在用用户名去调后台接口即可。

<script language="JavaScript">
    $(document).ready(function(){
            var myName="<%=session.getAttribute("CURRENT_USER")%>";
            var projiectid1= "<%=request.getAttribute("projectid")%>";
            if(myName=="null"){
                window.location.href="/page/toindex";
            }
</script>

  3.用户注销

     注销,即清除Session中的值即可,由后台开放一个注销接口。

@RequestMapping("/quitUser")
    public String quitUser(HttpServletRequest request){
        HttpSession session = request.getSession();
        session.removeAttribute("CURRENT_USER");
        return "index";
    }

  这样就实现了一套从登陆到注销的用户管理体系,但是这是一种最基础的体系,安全性由很大的问题,所以类似于JWT TOKEN之类的验证方案还是很有用武之地的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏zhisheng

渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(下)

上篇文章写完了 ES 流程启动的一部分,main 方法都入口,以及创建 Elasticsearch 运行的必须环境以及相关配置,接着就是创建该环境的节点了。

1443
来自专栏Java后端技术

Java发送邮件初窥

  最近朋友的公司有用到这个功能,之前对这一块也不是很熟悉,就和他一起解决出现的异常的同时,也初窥一下使用Apache Common Email组件进行邮件发送...

1252
来自专栏xdecode

Java源码安全审查

最近业务需要出一份Java Web应用源码安全审查报告, 对比了市面上数种工具及其分析结果, 基于结果总结了一份规则库. 本文目录结构如下: 

5582
来自专栏JadePeng的技术博客

XNginx - nginx 集群可视化管理工具

之前团队的nginx管理,都是运维同学每次去修改配置文件,然后重启,非常不方便,一直想找一个可以方便管理nginx集群的工具,翻遍web,未寻到可用之物,于是自...

1.2K4
来自专栏码农阿宇

国内开源社区巨作AspectCore-Framework入门

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技...

2461
来自专栏开发之途

Android 模拟登陆网站实现移动客户端

5418
来自专栏好好学java的技术栈

SpringBoot 使用Swagger2打造在线接口文档(附源代码)

想必很多小伙伴都曾经使用过Swagger,但是打开UI界面之后,却是下面这样的画风,纯英文的界面并不太友好,作为国人还是习惯中文界面。

2011
来自专栏weixuqin 的专栏

mybatis 学习笔记(四):mybatis 和 spring 的整合

在这里我们通过原始 dao 开发和,mapper 代理开发 dao 层两种方式来举例 mybatis 和 spring 整合的操作。

1562
来自专栏linux驱动个人学习

Linux内核同步机制之completion

1452
来自专栏MasiMaro 的技术博文

OLEDB数据源

OLEDB虽然是基于COM的一组接口,但是它与标准的COM接口有点不同,它的一大特色在于它自身的属性设置,有的接口虽然对象中存在但是调用QueryInterfa...

1292

扫码关注云+社区