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之类的验证方案还是很有用武之地的。

原文地址:https://www.cnblogs.com/rekent/p/7691116.html