天天看點

JavaWeb之session應用

session和cookie都是用來存儲資訊的,差別是session是在伺服器端存儲資訊,而cookie則是在浏覽器端存儲資訊。

通常伺服器端存儲session,伺服器端存儲和擷取session,一般情況下是比較安全的,不排除黑客侵襲的情況下。不過cookie的話,容易因為cookie欺騙而導緻安全性問題。

當然了,現在因為token的流行和應用廣泛,使用cookie也不怕安全性問題。

将使用者資訊存儲到session中可以參考如下代碼:

@PostMapping(value = "/login",produces="application/json;charset=utf-8")
    @SysLog(type="背景系統",action="登入功能",method="POST")
    @ApiOperation(value="登入",httpMethod="POST",notes="若登入後token未過期則傳回原token,并按照預先定義的有效時間順延,若過期則生成新token,有效期預設10小時")
    public JSONObject getLockPwd(@RequestParam String username, @RequestParam String password, HttpSession session,HttpServletResponse response) {
        //接收前台參數
        logger.info("使用者名:"+username);
        logger.info("密碼:"+password);
        //調用查詢邏輯
        EntityWrapper<SysUser> wrapper = new EntityWrapper<SysUser>();
        wrapper.eq("login_code", username);
        SysUser user = userService.selectOne(wrapper);
        
        JSONObject json = new JSONObject();
        
        if(user != null && "0".equals(user.getStatus())) {
            //擷取目前使用者
            Subject subject = SecurityUtils.getSubject();  
            
            //根據前台傳的使用者名和密碼進行認證
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);         
      
            try {
                //認證通過
                subject.login(token); 
            
                String encode = Base64.encode(user.getUserCode());
                
                //Cookie有效期預設為8小時
                int time=28800;
                
                //将Cookie加密為16進制字元串
                CookieUtils.setCookie(response,  "userCode", encode, time);

                user.setLastLoginDate(DateUtil.date());
                userService.updateById(user);
                
                //将userCode放入session中儲存
                session.setAttribute("userCode", user.getUserCode());
                
                json.put("token", subject.getSession().getId());
                json.put(CommonEnum.RETURN_CODE, "000000");
                json.put(CommonEnum.RETURN_MSG, "登入成功");
            } catch (IncorrectCredentialsException e) {
                json.put(CommonEnum.RETURN_CODE, "111111");
                json.put(CommonEnum.RETURN_MSG, "使用者名或密碼錯誤");
            }catch (Exception e) {
                json.put(CommonEnum.RETURN_CODE, "222222");
                json.put(CommonEnum.RETURN_MSG, "特殊異常");
            }
        }else {
            json.put(CommonEnum.RETURN_CODE, "500");
            json.put(CommonEnum.RETURN_MSG, "使用者不存在");
        }    
        
        return json;

    }
          

關鍵就是session.setAttribute("userCode", user.getUserCode())這段代碼

關于Cookie加密或者是用Cookie存儲資訊和清除Cookie,可以參考我的這篇文章:

js之清除Cookie

如果擷取session,參考如下代碼:

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        
        //擷取session
        String userCode = (String) request.getSession().getAttribute("userCode");
              

繼續閱讀