m0_74322651 2023-12-09 13:38 采纳率: 0%
浏览 33

强智教务系统模拟登录查成绩

#强智教务系统模拟登录
#java
闲着没事想做一个教务系统查询的功能,但是到了登录最后一步遇到一个cookie问题
先介绍一下过程
首先

img


进入登录页面时会收到一个响应过来的cookie
SERVERID=124; bzb_njw=7A0DED7174921F6C9C56255ED70AA99F
让后呢我正常登录系统,通过网络请求发现请求携带的数据如下

img


发现这个encode是根据在这个请求之前的一个有一个请求是根据请求携带回去的cookie在服务端生成一个类似密钥的东西然后响应回来的dataStr再做拼接,拼接成encode下面是我在页面源代码中找到的生成encode代码

img

然后嘞我把这个改造迁移到我的项目里,生成dataStr也是在我的java里响应过去的

@Override
    public Result jwxt() throws IOException, UnirestException {
        Unirest.setTimeouts(0, 0);
        HttpResponse<String> response = Unirest.get("http://172.20.63.226:80/")
                .header("Connection", "keep-alive")
                .asString();
        System.out.println(response.getHeaders()+"响应1");
        Map<String, List<String>> headers = response.getHeaders();
        List<String> cookieHeaders = headers.get("Set-Cookie");


        if (cookieHeaders != null) {
            for (String header : cookieHeaders) {
                if (header.contains("bzb_njw")) {
                    // 解析bzb_njw的值
                    bzb_njw = header.split("=")[1].split(";")[0];
                } else if (header.contains("SERVERID")) {
                    // 解析SERVERID的值
                    SERVERID = header.split("=")[1].split(";")[0];
                }
            }
        }


        //获取教务系统验证码
        try {
            Unirest.setTimeouts(0, 0);
            HttpResponse<InputStream> response2 = Unirest.get("http://172.20.63.226:80/verifycode.servlet")
                    .header("Cookie", "bzb_njw="+bzb_njw+"; SERVERID="+SERVERID)
                    .header("Connection","keep-alive")
                    .asBinary();
           System.out.println( response2.getHeaders()+"响应2");
            // 将响应体转为Base64编码
            byte[] buffer = new byte[1024];
            int len;
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            while ((len = response2.getBody().read(buffer)) != -1) {
                outputStream.write(buffer, 0, len);
            }
            String image = Base64.getEncoder().encodeToString(outputStream.toByteArray());
            String dataStr = beforLogin();
            return Result.success(dataStr,image);
        } catch (UnirestException | IOException e) {
            throw new RuntimeException(e);
        }
    }


        @Override
    public Result login(JwxtLogin jwxtLogin) throws UnirestException {
        this.userAccount = jwxtLogin.getUserAccount();
        this.userPassword = jwxtLogin.getUserPassword();
        this.encoded = jwxtLogin.getEncoded();
        this.imageToken = jwxtLogin.getImageToken();

            Unirest.setTimeouts(0, 0);
            HttpResponse<String> response = Unirest.post("http://172.20.63.226:80/Logon.do?method=logon")
                    .header("Cookie", "SERVERID=" + SERVERID + "; bzb_njw=" + bzb_njw)
                    .header("Connection","keep-alive")
                    .field("userAccount", userAccount)
                    .field("userPassword", "")
                    .field("RANDOMCODE", imageToken)
                    .field("encoded", encoded)
                    .asString();
            System.out.println(response.getHeaders()+"响应3");
            Map<String, List<String>> headers = response.getHeaders();
            List<String> locationHeaders = headers.get("Location");
            if (locationHeaders != null && !locationHeaders.isEmpty()) {
                Location = locationHeaders.get(0);
                System.out.println(Location+"loca");
            }

            System.out.println(SERVERID+"***************");

            return Result.success(Location, new Cookie(bzb_njw,SERVERID,null));
    }

    @Override
    public Result getCookie(Cookie cookie) {
        stringRedisTemplate.opsForValue().set("bzb_jsxsd",cookie.getBzb_jsxsd());
        return Result.success();
    }

    public String beforLogin() {
        try {
            Unirest.setTimeouts(0, 0);
            HttpResponse<String> response = Unirest.post("http://172.20.63.226:80/Logon.do?method=logon&flag=sess")
                    .header("Connection","keep-alive")
                    .header("Cookie", "SERVERID=" + SERVERID + "; bzb_njw=" + bzb_njw)
                    .asString();
            int status = response.getStatus();
            String body = response.getBody();
            System.out.println("123Code: " + status);
            System.out.println("123oken: " + body);
            token = body;
            // 获取 cookie
            System.out.println(response.getHeaders()+"响应5");
            String cookie = response.getHeaders().getFirst("SERVERID");
            System.out.println("Cookie: " + cookie);
            return body;
        } catch (UnirestException e) {
            throw new RuntimeException(e);
        }

    }
}

我的前端如下

img

大概就是我访问我的页面时会我的后端会帮我把首次访问教务系统带来的cookie储存起来然后进行后面的操作比如我的后端请求http://172.20.63.226/Logon.do?method=logon&flag=sess%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%AF%86%E9%92%A5%E4%BC%9A%E8%BF%94%E5%9B%9E%E5%89%8D%E7%AB%AF,%E4%B9%9F%E4%BC%9A%E6%8A%8A%E9%AA%8C%E8%AF%81%E7%A0%81%E5%9B%BE%E7%89%87%E4%BB%A5base64%E5%BD%A2%E5%BC%8F%E5%8F%8D%E9%A6%88%E7%BB%99%E5%89%8D%E7%AB%AF%EF%BC%8C%E7%84%B6%E5%90%8E%E5%89%8D%E7%AB%AF%E5%86%8D%E5%81%9A%E6%8B%BC%E6%8E%A5%E6%88%90encode%E5%86%8D%E8%BF%9B%E8%A1%8Clogin,%E7%84%B6%E5%90%8E%E6%8E%A5%E4%B8%8B%E6%9D%A5%E9%81%87%E5%88%B0%E4%BA%86%E4%B8%80%E4%B8%AA%E5%A4%B4%E7%96%BC%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%8C%E5%B0%B1%E6%98%AF%E7%99%BB%E5%BD%95%E6%97%B6%E7%9A%84%E9%82%A3%E4%B8%AA%E8%AF%B7%E6%B1%82%EF%BC%8C%E5%BE%80%E4%B8%8B%E7%9C%8B
我后端携带数据请求
http://172.20.63.226/Logon.do?method=logon

img

也就是下面正常登录的请求

img

发现重定向访问了那个很长的地址,在很长这个请求才会返回给我最终的有权限的cookie如下图

img

并且以后的查课查成绩都会用到bzb_njw,bzb_jsxsd,SERVERID这三个cookie可是我后端就是拿不到最终的bzb_jsxsd,在后端访问是拿不到cookie的只有在浏览器直接访问那个长长的请求才能拿到,哎,有没有办法解决这个问题,我试了很多方法还是不能在我的登录页面实现获取最终的那个cookie,有没有人给点思路,多谢了

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-09 16:52
    关注

    【以下回答由 GPT 生成】

    首先,我们需要了解教务系统的登录流程和cookie的用途,然后才能解决这个问题。

    教务系统的登录流程通常包括以下步骤:

    1. 用户发送登录请求。
    2. 服务器验证用户凭据(用户名和密码)是否正确。
    3. 如果验证成功,服务器会返回一个相应的cookie给用户,在后续的请求中需要携带该cookie来保持用户会话状态。

    在你提供的例子中,你已经获取到了登录页面响应中的cookie,并解析出了其中的一些值。然而,你还没有在Java代码中模拟发送登录请求并携带该cookie来验证用户凭据。下面是一个可能的解决方案:

    1. 导入必要的库:
    import java.util.*;
    import org.apache.http.*;
    import org.apache.http.client.*;
    import org.apache.http.client.methods.*;
    import org.apache.http.impl.client.*;
    import org.apache.http.message.*;
    
    1. 在Java代码中实现登录功能:
    public class JWXTLogin {
    
        private String bzb_njw;       // 存储解析出的bzb_njw值
        private String SERVERID;      // 存储解析出的SERVERID值
        private String loginUrl;      // 登录请求的URL
        private String username;      // 登录用户名
        private String password;      // 登录密码
    
        public JWXTLogin(String loginUrl, String username, String password) {
            this.loginUrl = loginUrl;
            this.username = username;
            this.password = password;
        }
    
        public void login() throws Exception {
            HttpClient httpclient = HttpClientBuilder.create().build();
    
            // 创建HttpPost对象,并设置请求头
            HttpPost httpPost = new HttpPost(loginUrl);
            httpPost.setHeader("Connection", "keep-alive");
            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
            httpPost.setHeader("Cookie", "bzb_njw=" + bzb_njw + ";SERVERID=" + SERVERID);
    
            // 设置请求参数
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("username", username));
            params.add(new BasicNameValuePair("password", password));
            httpPost.setEntity(new UrlEncodedFormEntity(params));
    
            // 发送登录请求
            HttpResponse response = httpclient.execute(httpPost);
    
            // 获取响应的cookie
            Header[] headers = response.getHeaders("Set-Cookie");
            for (Header header : headers) {
                String cookie = header.getValue();
                if (cookie.contains("bzb_njw")) {
                    bzb_njw = cookie.split("=")[1].split(";")[0];
                } else if (cookie.contains("SERVERID")) {
                    SERVERID = cookie.split("=")[1].split(";")[0];
                }
            }
    
            // 根据需要处理登录后的响应
            // ...
        }
    
        public static void main(String[] args) throws Exception {
            // 创建登录对象,传入登录URL、用户名和密码
            JWXTLogin jwxtLogin = new JWXTLogin("http://172.20.63.226:80/login", "your_username", "your_password");
    
            // 执行登录
            jwxtLogin.login();
        }
    }
    

    在上面的代码中,我们创建了一个JWXTLogin类来封装登录功能。在login方法中,我们使用Apache HttpClient库发送登录请求,并通过设置请求头Cookie字段来携带上一次登录页面响应中的cookie。然后,我们可以根据需要处理登录后的响应。

    请注意将代码中的your_usernameyour_password替换为真实的用户名和密码。

    希望这个解决方案可以帮助到你,如果还有其他问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月9日

悬赏问题

  • ¥30 计算机硬件实验报告寻代
  • ¥15 51单片机写代码,要求是图片上的要求,请大家积极参与,设计一个时钟,时间从12:00开始计时,液晶屏第一行显示time,第二行显示时间
  • ¥15 用C语言判断命题逻辑关系
  • ¥15 原子操作+O3编译,程序挂住
  • ¥15 使用STM32F103C6微控制器设计两个从0到F计数的一位数计数器(数字),同时,有一个控制按钮,可以选择哪个计数器工作:需要两个七段显示器和一个按钮。
  • ¥15 在yolo1到yolo11网络模型中,具体有哪些模型可以用作图像分类?
  • ¥15 AD9910输出波形向上偏移,波谷不为0V
  • ¥15 淘宝自动下单XPath自动点击插件无法点击特定<span>元素,如何解决?
  • ¥15 曙光1620-g30服务器安装硬盘后 看不到硬盘
  • ¥15 抖音直播广场scheme