###Http Http (超文本輸出協議) 是一種分散式、協作式和超媒體信息系統的應用層協議,它通常運行在TCP之上,網際網路應用最廣泛的便是Http協議,所有www都遵循這個標準。主要用於Web 瀏覽器與 Web 伺服器之間的通信而設計的,但也可以用於其他目的,是一個基於 TCP/IP 通信協議來 ...
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);
}
}