JavaWeb~使用HttpServer和Html 实现登录界面并跳转到个人简历(体会Cookie的用途)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

for (String s : kv

) {

String[] result = s.split(“=”);

parameters1.put(result[0], result[1]);

}

}

// 给这个类构造一些 getter 方法. (不要搞 setter).

// 请求对象的内容应该是从网络上解析来的. 用户不应该修改.

public String getMethod() {

return method;

}

public String getUrl() {

return url;

}

public String getVersion() {

return version;

}

public String getBody() {

return body;

}

public String getHeaders(String key) {

return headers.get(key);

}

// 此处的 getter 手动写, 自动生成的版本是直接得到整个 hash 表.

// 而我们需要的是根据 key 来获取值.

public String getCookie(String key) {

return cookies.get(key);

}

public String getPararmeters(String key) {

return parameters.get(key);

}

@Override

public String toString() {

return “HttpRequest{” +

“method '” + method + ‘’’ +

“, url '” + url + ‘’’ +

“, version '” + version + ‘’’ +

", headers " + headers +

", parameters " + parameters +

", cookies " + cookies +

“, body '” + body + ‘’’ +

‘}’;

}

}

实现返回响应

=====================================================================

  • 注释详解

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.util.HashMap;

import java.util.Map;

public class HttpRespond {

private String version = “HTTP/1.1”;

private int statue; // 状态码

private String message; // 状态码的描述信息

private Map<String, String> headers = new HashMap<>();

private StringBuilder body = new StringBuilder(); // 方便一会进行拼接.

// 当代码需要把响应写回给客户端的时候, 就往这个 OutputStream 中写就好了

private OutputStream outputStream;

// 表示一个 HTTP 响应, 负责构造

// 进行序列化操作

public static HttpRespond build(OutputStream outputStream) {

HttpRespond respond = new HttpRespond();

respond.outputStream = outputStream;

// 除了 outputStream 之外, 其他的属性的内容, 暂时都无法确定. 要根据代码的具体业务逻辑

// 来确定. (服务器的 “根据请求并计算响应” 阶段来进行设置的)

return respond;

}

public void setVersion(String version) {

this.version = version;

}

public void setStatue(int statue) {

this.statue = statue;

}

public void setMessage(String message) {

this.message = message;

}

public void setHeaders(String key, String value) {

this.headers.put(key, value);

}

public void setBody(String body) {

this.body.append(body);

}

// 以上的设置属性的操作都是在内存中倒腾.

// 还需要一个专门的方法, 把这些属性 按照 HTTP 协议 都写到 socket 中.

public void flush() throws IOException {

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));

String firstLine = version + " " + statue + " " + message;

bufferedWriter.write(firstLine + “\n”);

headers.put(“Content-Length”, body.toString().getBytes().length + “”);

for (Map.Entry<String, String> entry : headers.entrySet()) {

bufferedWriter.write(entry.getKey() + ": " + entry.getValue() + “\n”);

}

bufferedWriter.write(“\n”);

bufferedWriter.write(body.toString() + “\n”);

bufferedWriter.flush();

}

}

实现Http Sever

===========================================================================

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.HashMap;

import java.util.Map;

import java.util.UUID;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class HttpSeverV3 {

//设置一个静态内部类表示user

static class User {

public String username;

public String password;

public User(String username, String password) {

this.username = username;

this.password = password;

}

@Override

public String toString() {

return “User{” +

“username='” + username + ‘’’ +

“, password='” + password + ‘’’ +

‘}’;

}

}

private ServerSocket serverSocket;

// session 会话. 指的就是同一个用户的一组访问服务器的操作, 归类到一起, 就是一个会话.

// 记者来采访你, 记者问的问题就是一个请求, 你回答的内容, 就是一个响应. 一次采访过程中

// 涉及到很多问题和回答(请求和响应), 这一组问题和回答, 就可以称为是一个 “会话” (整个采访的过程)

// sessions 中就包含很多会话. (每个键值对就是一个会话)

private Map<String, User> sessions = new HashMap<>();

public HttpSeverV3(int port) throws IOException {

this.serverSocket = new ServerSocket(port);

}

public void start() throws IOException {

System.out.println(“服务器启动”);

ExecutorService executorService = Executors.newCachedThreadPool();

while (true) {

Socket clientSocket = serverSocket.accept();

executorService.execute(new Runnable() {

@Override

public void run() {

process(clientSocket);

}

});

}

}

private void process(Socket clientSocket) {

try {

HttpRequest request = HttpRequest.build(clientSocket.getInputStream());

HttpRespond respond = HttpRespond.build(clientSocket.getOutputStream());

if (request.getMethod() != null) {

//判断请求是什么方法 不同方法不同处理

if (“GET”.equalsIgnoreCase(request.getMethod())) {

doGet(request, respond);

} else if (“POST”.equalsIgnoreCase(request.getMethod())) {

doPost(request, respond);

} else {

respond.setHeaders(“Content-type”, “text/html”);

respond.setStatue(404);

respond.setMessage(“No Found”);

respond.setBody(“

NULL

”);

}

//写入

respond.flush();

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

clientSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

private void doPost(HttpRequest request, HttpRespond respond) throws IOException {

if (request.getUrl().startsWith(“/login”)) {

System.out.println(request);

//判断登录名和密码是否正确

String userName = request.getPararmeters(“username”);

String password = request.getPararmeters(“password”);

if (“123”.equals(userName) && “aaa”.equals(password)) {

//登录成功

respond.setStatue(200);

respond.setMessage(“OK”);

respond.setHeaders(“Content-type”, “text/html”);

//通过cookie让浏览器记住你

// 现有的对于登陆成功的处理. 给这次登陆的用户分配了一个 session

// (在 hash 中新增了一个键值对), key 是随机生成的. value 就是用户的身份信息

// 身份信息保存在服务器中, 此时也就不再有泄露的问题了

// 给浏览器返回的 Cookie 中只需要包含 sessionId 即可

String sessionId = UUID.randomUUID().toString();

sessions.put(sessionId, new User(userName, password));

respond.setHeaders(“Set-Cookie”, “sessionId=”+sessionId);

InputStream inputStream = HttpSeverV3.class.getClassLoader().getResourceAsStream(“LoginFinish.html”);

assert inputStream != null;

BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(inputStream));

String line = null;

while ((line = bufferedReader.readLine()) != null) {

respond.setBody(line);

}

bufferedReader.close();

} else {

//登录失败

respond.setStatue(200);

respond.setMessage(“OK”);

respond.setHeaders(“Content-type”, “text/html”);

//登录失败应该让重写登录

InputStream inputStream = HttpSeverV3.class.getClassLoader().getResourceAsStream(“Test.html”);

assert inputStream != null;

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

//按行读取写入到body中

String line = null;

while ((line = bufferedReader.readLine()) != null) {

respond.setBody(line);

}

bufferedReader.close();

}

}

}

private void doGet(HttpRequest request, HttpRespond respond) throws IOException {

//返回一个html文件

if (request.getUrl().startsWith(“/ok”)) {

System.out.println(request);

//查看浏览器中是否有cookie 并且根据sessionId得到的用户的密码正确

String sessionId = request.getCookie(“sessionId”);

User user = sessions.get(sessionId);

if (user != null && “123”.equals(user.username) && “aaa”.equals(user.password)) {

//说明此时登录的用户就是主人直接返回简历

respond.setStatue(200);

respond.setMessage(“OK”);

respond.setHeaders(“Content-type”, “text/html”);

InputStream inputStream = HttpSeverV3.class.getClassLoader().getResourceAsStream(“LoginFinish.html”);

assert inputStream != null;

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

//按行读取写入到body中

String line = null;

while ((line = bufferedReader.readLine()) != null) {

respond.setBody(line);

}

bufferedReader.close();

} else {

respond.setHeaders(“Content-type”, “text/html”);

respond.setStatue(200);

respond.setMessage(“Ok”);

//在这里我们先获取类对象再获取类加载器 最后根据文件名在Resource目录中找到该文件 返回其InputStream对象

InputStream inputStream = HttpSeverV3.class.getClassLoader().getResourceAsStream(“Test.html”);

assert inputStream != null;

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

//按行读取写入到body中

String line = null;

while ((line = bufferedReader.readLine()) != null) {

respond.setBody(line);

}

bufferedReader.close();

}

}

}

public static void main(String[] args) throws IOException {

HttpSeverV3 v3 = new HttpSeverV3(9090);

v3.start();

}

}

登录界面代码

=====================================================================

<!doctype htpl>

用户登录

style=“width: 30%;margin:auto;background:rgb(195,195,195)”

bordercolor=“red” >

请登录 用户名: 密码:

个人简历代码

=====================================================================

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

个人简历代码

=====================================================================

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

[外链图片转存中…(img-sDkP9uqZ-1713611840631)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-MT3gz80C-1713611840632)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaWeb应用中,为了实现用户登录认证,通常会使用Session和Cookie。 Session是在服务端保存用户状态的一种机制,每个用户在访问服务器时都会被分配一个唯一的Session ID,通过该ID可以在服务端存储和获取与该用户相关的信息。在用户登录后,可以将用户信息存储到Session中,供之后的页面访问和使用Cookie是在客户端保存用户状态的一种机制,通过在服务端设置Cookie,在客户端保存一个唯一的标识符,带着该标识符可以在客户端和服务端之间传递数据。在用户登录后,可以将用户信息存储到Cookie中,供之后的页面访问和使用使用Session和Cookie实现登录认证的基本流程如下: 1. 用户在登录页面输入用户名和密码。 2. 服务器接收到请求后,验证用户名和密码是否正确。 3. 如果验证通过,生成一个唯一的Session ID,并将用户信息存储到Session中。 4. 将Session ID 存储到Cookie中,并设置Cookie的有效期。 5. 用户访问其他页面时,将Cookie中的Session ID 发送到服务器服务器根据Session ID 获取用户信息,判断用户是否登录。 6. 如果用户已经登录,返回需要访问的页面内容;如果用户未登录跳转登录页面。 示例代码如下: ```java // 生成Session ID String sessionId = UUID.randomUUID().toString(); // 将用户信息存储到Session中 HttpSession session = request.getSession(); session.setAttribute("username", username); // 将Session ID 存储到Cookie中,并设置有效期为1天 Cookie cookie = new Cookie("sessionId", sessionId); cookie.setMaxAge(24 * 60 * 60); response.addCookie(cookie); // 获取Cookie中的Session ID,并根据Session ID 获取用户信息 Cookie[] cookies = request.getCookies(); String sessionId = null; if (cookies != null) { for (Cookie c : cookies) { if ("sessionId".equals(c.getName())) { sessionId = c.getValue(); break; } } } if (sessionId != null) { HttpSession session = request.getSession(false); if (session != null) { String username = (String) session.getAttribute("username"); if (username != null) { // 用户已经登录,返回需要访问的页面内容 } } } // 用户未登录跳转登录页面 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值