Http、Https简介和Session、token的请求流程
Http
Http (超文本输出协议) 是一种分布式、协作式和超媒体信息系统的应用层协议,它通常运行在TCP之上,因特网应用最广泛的便是Http协议,所有www都遵循这个标准。主要用于Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的,是一个基于 TCP/IP 通信协议来传递数据的(HTML 文件、图片文件、查询结果等)。简单的来说,是用于获取和请求,客户端和服务端传递数据
常用请求方式
* get: 从服务器获取请求
* post:更新、修改数据
* delete: 删除数据
* put:创建数据,和insert对应
Https
HTTPS(超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性
Session原理
Http 无状态,有会话:
-
无状态是指,请求之间互相独立,第一次请求的数据,第二次请求不能重用
-
有会话是指,客户端和服务端都有相应的技术,可用暂存数据,让数据在请求间共享
服务端使用了Session技术来暂存数据
Session技术实现身份验证
比较适合于单体项目
流程解析:
一、
1. 用户向服务端发送登录请求
2. LoginController验证用户名,密码是否正确
3. 验证通过后,记录下验证通过的标记
4. 存储标记到Session中
5. 登录成功
二、
1. 用户的其他请求要访问权限时,发送请求到LoginInterrceptor拦截器
2. 拦截器检测是否存在用户名
3. 存在即可访问,不存在用户名则要用户登录
点击查看代码
//JavaWeb
package com.wyw.text.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wyw.text.Dao.UserDao;
import com.wyw.text.Dao.impl.UserDaoimpl;
import com.wyw.text.domin.User;
@WebServlet("/loginservlet")
public class loginservlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public loginservlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/heml;charset=utf-8");
request.setCharacterEncoding("utf-8");
String username=request.getParameter("username");
String password=request.getParameter("password");
UserDao userDao=new UserDaoimpl();
User user=userDao.addfind(username, password);
if(user==null){
request.setAttribute("pwd", "用户名或者密码错误");
request.getRequestDispatcher("/login.jsp").forward(request,response);
return ;
}else{
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getContextPath()+"/index.jsp");
return ;
}
}
}
Jwt技术实现身份验证
比较适合分布式项目
流程解析:
一、
1. 用户向服务端LoginController发送登录请求
2. LoginController验证用户名,密码是否正确
3. 验证通过后,返回token到客户端,并存储起来(例如cookie)
4. 登录成功
二、
1. 客户端其他页面的请求,并携带token
2. 过滤器验证token
3. 校验无误即可访问
过滤器代码
点击查看代码
package com.kob.backend.config.filter;
import com.kob.backend.mapper.UserMapper;
import com.kob.backend.pojo.User;
import com.kob.backend.service.impl.utils.UserDetailsImpl;
import com.kob.backend.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Autowired
private UserMapper userMapper;
@Override
protected void doFilterInternal(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain) throws ServletException, IOException {
String token = request.getHeader("Authorization");
if (!StringUtils.hasText(token) || !token.startsWith("Bearer ")) {
filterChain.doFilter(request, response);
return;
}
token = token.substring(7);
String userid;
try {
Claims claims = JwtUtil.parseJWT(token);
userid = claims.getSubject();
} catch (Exception e) {
throw new RuntimeException(e);
}
User user = userMapper.selectById(Integer.parseInt(userid));
if (user == null) {
throw new RuntimeException("用户名未登录");
}
UserDetailsImpl loginUser = new UserDetailsImpl(user);
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginUser, null, null);
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
filterChain.doFilter(request, response);
}
}