springboot 调用第三方api,登录获取cookie并判断cookie有效时间失效重新获取代码示例

下面是一个使用Spring Boot框架调用第三方API实现登录获取Cookie并判断Cookie有效时间的示例代码:

@RestController
public class LoginController {
    private static final String API_URL = "https://example.com/api/login";
    private static final String COOKIE_NAME = "SESSION_ID";
    private static final int COOKIE_MAX_AGE = 60 * 60; // 设置Cookie有效时间为1小时
    @PostMapping("/login")
    public String doLogin(HttpServletRequest request, HttpServletResponse response, @RequestParam String username, @RequestParam String password) throws IOException {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(API_URL);
        httpPost.setHeader("Content-Type", "application/json;charset=UTF-8");
        JSONObject json = new JSONObject();
        json.put("username", username);
        json.put("password", password);
        StringEntity entity = new StringEntity(json.toString(), "UTF-8");
        httpPost.setEntity(entity);
        CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
        String responseBody = EntityUtils.toString(httpResponse.getEntity());
        if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            // 登录成功,获取Cookie并设置有效时间
            String sessionId = httpResponse.getFirstHeader("Set-Cookie").getValue().split(";")[0];
            Cookie cookie = new Cookie(COOKIE_NAME, sessionId);
            cookie.setMaxAge(COOKIE_MAX_AGE);
            response.addCookie(cookie);
            return "redirect:/welcome";
        } else {
            // 登录失败,返回错误信息
            return responseBody;
        }
    }
    @GetMapping("/welcome")
    public String welcome(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(COOKIE_NAME)) {
                    String sessionId = cookie.getValue();
                    // 判断Cookie是否过期
                    if (cookie.getMaxAge() > 0) {
                        // 验证Cookie是否有效
                        CloseableHttpClient httpClient = HttpClients.createDefault();
                        HttpGet httpGet = new HttpGet(API_URL + "?sessionId=" + sessionId);
                        CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
                        String responseBody = EntityUtils.toString(httpResponse.getEntity());
                        if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                            // Cookie有效,返回欢迎页面
                            return "welcome";
                        } else {
                            // Cookie无效,重定向到登录页面
                            return "redirect:/login";
                        }
                    }
                }
            }
        }
        // 没有找到Cookie或者Cookie已过期,重定向到登录页面
        return "redirect:/login";
    }
}

代码说明:

@RestController注解表示这是一个REST风格的控制器类,可以处理HTTP请求和响应。

API_URL表示第三方API的URL地址,COOKIE_NAME表示Cookie的名称,COOKIE_MAX_AGE表示Cookie的有效时间,单位为秒。

HttpServletRequest和HttpServletResponse是Spring Boot中的类,用于处理HTTP请求和响应。

@RequestParam注解表示获取请求参数的值,其中username和password是请求参数名。

使用Apache HttpClient库发送POST请求,将用户名和密码包装成JSON格式的字符串,并设置请求头的Content-Type为application/json;charset=UTF-8。

通过httpResponse获取API返回的响应状态码和响应体,如果状态码为200,则登录成功,从响应头中获取Cookie的值,并创建一个名为COOKIE_NAME的Cookie,设置Cookie的有效时间为COOKIE_MAX_AGE,并将Cookie添加到响应中,同时重定向到欢迎页面;否则登录失败,返回错误信息。

在welcome()方法中判断用户是否已经登录,首先获取请求中的Cookie数组,然后遍历数组查找名为COOKIE_NAME的Cookie,如果找到了则获取Cookie的值,并判断Cookie是否过期(即getMaxAge()是否大于0),如果未过期则使用Cookie中的sessionId参数向API发送GET请求,验证Cookie是否有效,如果API返回的状态码为200,则Cookie有效,返回欢迎页面;否则Cookie无效,重定向到登录页面;如果没有找到名为COOKIE_NAME的Cookie则重定向到登录页面。 需要注意的是,这只是一个简单的示例代码,实际应用中需要根据API的返回格式和业务需求进行修改和扩展。另外,同样需要进行密码加密存储和CSRF防护等安全措施。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重写 支持库说明: 本次更新完全使用C语言重写 ,相比易语言, 稳定性提升 ,速度提升 , C语言原生调用,带来原汁原味的快感。 【C语言支持库的好处】         原生调用,方法、函数、类型等即得即用,无需转换xx类型及读写内存。        指针、内存、回调统统搞定        cdcel与stdcall直接调用,无需自己实现转换,稳定性+100%        使用易语言官方提供的、有保障的头文件,错误率<0.1%直接编译生成动态库 fne,静态库lib,无需转换,安全稳定        超过数千行的源代码,完整重构        对原支持库的逻辑和结构进行优化 总结起来三个字: 稳     快     好 -------------------------------------------------------------------- miniblink内核dll更新迭代次数: 20次以上(距离上次易语言正式版支持库发布) 累计BUG修复 约:110+项 累计功能性改进约:170+项 再次感谢 miniblink作者的更新维护。 【性能提升】         启动速度提升:30%以上,xx经过打开到加载完毕时间统计获得。         操作响应速度提升明显。  在不特别复杂的网页逻辑下,响应速度提升明显。         动画速度与显示效果提升,使效果更加平滑。  具体可以参考组合框、颜色选择器等组件。 ------------------分割线 ---------------- 【更新日志】 【正式版】2020年11月25日 版本号: 1.6.1125 更新说明:         修复:                 *新窗口无法弹出的问题                 *ajax失效问题                 *修复新窗口无法挂接事件的问题                 *获取所有Cookie() 会崩溃的问题                 *修复新窗口创建失败的问题         新增:                 *新增一个事件, #浏览器事件_绘画事件, 浏览器发生重画时触发, 使用 挂接事件() 进行挂接         删除:                 *弃用支持库里所有对cookie进行二次封装的命令 , 所有cookie相关的命令都是原封调用node.dll                         设置cookie调用 设置cookie_CURL(), 该命令原封调用node.dll的wkeSetCookie接口                         支持库所有cookie相关的命令都是原封调用node.dll, 不会做任何修改 【正式版】2020年11月24日 更新说明: 修复:                 *优化程序稳定性                 *修复几处已知的内存泄漏问题                 *修复 特殊功能.取post数据() 可能会崩溃的问题                 *修复WKE_填表 已知问题, 类内的方法基本都重写了                 *修复部分网页打开会崩溃问题                 *修复WKE_填表.post() url数据类型问题                 *获取HTTP头字段信息(), 参数key类型改为文本型                 *获取响应HTTP头字段信息(), 参数key类型改为文本型                 *调用DevTool(), 参数3不在内部进行编码, 传递的文本必须先转换成utf8在传递进去                 *优化启动速度                 *修复ajax.post 数据过长崩溃问题                 *修复取框架文本错误问题, 取网页源码支持获取指定框架了         新增:                 事件:                         *打开文件对话框, 全局事件, 只有第一个精易web浏览器组件收到此消息                         *保存文件对话框, 全局事件, 只有第一个精易web浏览器组件收到此消息                         *网页图标改变                 命令:                         *wke_消息循环, 此方法会屏蔽易语言自带的消息循环, 使得精易web浏览器组件能使用tab键切换焦点                         *wke

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值