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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/539158.html
標籤:其他
