我记录

cookie 加密授权

掷鸡蛋者 发布于 2015/9/20 21:20 浏览: 611 回复: 0 所在分类:java

源码中对 cookie 的封装


1)获取用户 id

根据默认的授权 cookie 名称,经过校验,然后获取 id

  long getUserId(HttpServletRequest request)


2)发送授权 cookie

将 cookie 签名哈桑之后,连同 userId,发送到客户端

  void addAuthCookie( HttpServletResponse response,long userId, int rememberDays) 


3)清除 cookie

  void clearAuthCookie(HttpServletResponse response) 


4)根据名称,获取 cookie

  Cookie getCookieByName(HttpServletRequest request, String cookieName) 

下面是没有封装的实现。 


完整的用户 cookie 管理


    @RequestMapping(value = "/userInfo")

    public ModelAndView userInfo(HttpServletRequest request) throws NoSuchAlgorithmException, SignatureException, JWTVerifyException, InvalidKeyException, IOException {


        ModelAndView x = new ModelAndView("/test/userInfo");


        long userId = getUserId(request);

        logger.info("userId=>" + userId);

        User user = userService.getById(userId);


        x.addObject("user", user);


        return x;

    }


    @RequestMapping(value = "userCheckLogin")

    @ResponseBody

    public String userCheckLogin(HttpServletRequest request, HttpServletResponse response) {


        String name = request.getParameter("name");

        String pwd = request.getParameter("pwd");


        if (name == null || name.length() == 0) return "请填写名称";

        if (pwd == null || pwd.length() == 0) return "请填写pwd";


        User x = userService.checkByNameAndPwd(name, pwd);

        if (x == null) {

            return "用户名或密码错误";

        }


        String token = getSignerResult(x); // 生成 token


        int maxAge = 60 * 60 * 24 * 7; // 7天

        Cookie cookie = new Cookie(SiteConfig.cookieName, token);

        cookie.setPath("/");

        if (maxAge > 0) {

            cookie.setMaxAge(maxAge);

        }


        response.addCookie(cookie);


        return "ok";


    }


    private String getSignerResult(User x) {

        JWTSigner signer = new JWTSigner(SiteConfig.cookieTokenKey);


        HashMap<String, Object> claims = new HashMap<String, Object>();


        User user = new User();

        user.setName(x.getName());

        user.setId(x.getId());


        claims.put("user", user);

        return signer.sign(claims);

    }


    private long getUserId(HttpServletRequest request) throws SignatureException, NoSuchAlgorithmException, JWTVerifyException, InvalidKeyException, IOException {


        Cookie cookie = getCookieByName(request, SiteConfig.cookieName);

        if (cookie == null) return 0;


        JWTVerifier verifier = new JWTVerifier(SiteConfig.cookieTokenKey);

        String token = cookie.getValue();

        if (!StringUtils.hasText(token)) return 0;


        Map<String, Object> decoded = verifier.verify(token);


        HashMap<String, Object> deUser = (HashMap<String, Object>) decoded.get("user");


        Object strUserId = deUser.get("id"); // 注意:这里是 id,不是 Id

        if (strUserId == null) return 0;


        return Long.parseLong(strUserId.toString());

    }


    private Cookie getCookieByName(HttpServletRequest request, String cookieName) {

        Cookie[] arrCookie = request.getCookies();

        for (Cookie cookie : arrCookie) {

            if (cookie.getName().equals(cookieName)) {

                return cookie;

            }

        }

        return null;

    }


    @RequestMapping(value = "/userLogout")

    public String userLogout(HttpServletResponse response) {


        Cookie cookie = new Cookie(SiteConfig.cookieName, null);

        cookie.setPath("/");

        cookie.setMaxAge(0);


        response.addCookie(cookie);


        return "redirect:/";


    }


掷鸡蛋者2015/9/20 21:20

留下脚印

踩一脚
copyright © 用微博记录这个时代 2010-2014
Powered by 我记录2.0
Processed in 0 seconds, 0 queries