return func(c *gin.Context) { origin := c.Request.Header.Get("origin") //请求头部 if len(origin) == 0 { origin = c.Request.Header.Get("Origin") } //接收客户端发送的origin (重要!) c.Writer.Header().Set("Access-Control-Allow-Origin", origin) //允许客户端传递校验信息比如 cookie (重要) c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") //服务器支持的所有跨域请求的方法 c.Writer.Header().Set("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE, UPDATE") c.Writer.Header().Set("Content-Type", "application/json; charset=utf-8") // 设置预验请求有效期为 86400 秒 c.Writer.Header().Set("Access-Control-Max-Age", "86400") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() }
时间: 2024-04-21 11:25:56 浏览: 16
使用 CSRF token 可以比较安全地传递校验信息。CSRF token 是一种防止跨站请求伪造攻击的技术,其原理是在服务器端生成一个随机字符串(token),并将其放入登录用户的 session 中,然后将该 token 发送给客户端,客户端每次请求时需要将该 token 一并发送给服务器,服务器验证该 token 是否与用户 session 中的一致,从而确定该请求是否有效。这样即使攻击者在客户端伪造请求,由于没有正确的 CSRF token,服务器会拒绝该请求。
相关问题
改正如下代码,要求可以正常运行package main import ( "fmt" "github.com/gin-gonic/gin" ) func TestMW(c *gin.Context) { c.String(200, "hello,%s", "ghz") } func MyMiddleware1(c *gin.Context) { fmt.Println("我的第一个中间件") } func MyMiddleware2(c *gin.Context) { fmt.Println("我的第二个中间件") } func main() { /* func Default() *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return engine } */ // e := gin.Default() // e := gin.New() e := gin.Default() e.Use(MyMiddleware1, MyMiddleware2) e.GET("testmw", TestMW) e.Run() }
你需要将 MyMiddleware1 和 MyMiddleware2 函数的参数类型改为 gin.HandlerFunc,代码如下:
```go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func TestMW(c *gin.Context) {
c.String(200, "hello,%s", "ghz")
}
func MyMiddleware1() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("我的第一个中间件")
c.Next()
}
}
func MyMiddleware2() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("我的第二个中间件")
c.Next()
}
}
func main() {
e := gin.Default()
e.Use(MyMiddleware1(), MyMiddleware2())
e.GET("testmw", TestMW)
e.Run()
}
```
其中 MyMiddleware1 和 MyMiddleware2 函数需要返回一个 gin.HandlerFunc 类型的函数,这个返回的函数才能被 gin 使用。在返回的函数中,我们需要手动调用 c.Next(),以便让请求继续往下执行。
// 发送好友请求 func SendFriendRequestHandler(c *gin.Context) { userID := c.PostForm("user_id") friendID := c.PostForm("friend_id") _, err := logic.SendFriendRequest(userID, friendID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } // 发送好友请求成功 c.JSON(http.StatusOK, gin.H{ "message": "好友请求已经发送", }) } //func get_friend_request() { // //} // 接受好友请求 func AcceptFriendRequestHandler(c *gin.Context) { // 从请求参数中获取用户ID和好友ID }以上代码中的AcceptFriendRequestHandler怎么写拒绝怎么写
以下是AcceptFriendRequestHandler的代码实现,以及RejectFriendRequestHandler的实现:
```go
// 接受好友请求
func AcceptFriendRequestHandler(c *gin.Context) {
userID := c.PostForm("user_id")
friendID := c.PostForm("friend_id")
_, err := logic.AcceptFriendRequest(userID, friendID)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "好友请求已被接受",
})
}
// 拒绝好友请求
func RejectFriendRequestHandler(c *gin.Context) {
userID := c.PostForm("user_id")
friendID := c.PostForm("friend_id")
err := logic.RejectFriendRequest(userID, friendID)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "好友请求已被拒绝",
})
}
```
需要在logic包中实现AcceptFriendRequest和RejectFriendRequest函数来完成好友请求的接受和拒绝功能。