成都网站建设设计

将想法与焦点和您一起共享

go语言请求拦截 go语言如何限制协程数量

GO语言之recover

    运行panic异常一旦被引发就会导致程序崩溃,这当然不是我们愿意看到的,go语言提供乐专用于“拦截”运行时panic的内建函数-recover,它可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。

为勉县等地区用户提供了全套网页设计制作服务,及勉县网站建设行业解决方案。主营业务为成都网站制作、网站设计、外贸网站建设、勉县网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

    注意:recover只有在defer调用的函数中有效

    如果调用了内置函数recover,并且定义该defer语句的函数发生了panic异常,recover会使用程序从panic中恢复,并且返回panic value,导致panic异常的函数不会继续执行,但能正常返回。在未发生panic时调用recover,recover会返回nil。

Go语言事件请求处理程序(Event Handler)

在Go语言的代码中,您需要引入官方的SDK库 aliyun/serverless/fc-runtime-go-sdk/fc,并实现handler函数和main函数。 示例如下:

传入的event参数是一个包含key属性的JSON字符串,示例如下。

具体的示例解析如下:

有效的Event Handler签名如下:

其中,InputType和OutputType与encoding/json标准库兼容。

Event Handler的使用需遵循以下规则:

事件函数的Handler示例代码:

gorilla/websocket使用教程

最近打算为我的网站添加一个服务器资源监视功能,需要服务端主动向前端推动资源占用数据。这时Http则不能达到要求。所以自然想到采用websocket。以前使用SpringBoot时使用websocket很简单,只需要将ServerEndpointExporter注入到bean容器并配合相应注解即可创建一个websocket服务。这里要感谢各位前辈的封装让我们能尽快实现相应的功能,但本次出于学习目并不是公司项目(效率稳定性至上)同时使用的开发语言为Golang,其web开发生态也不会像Java那样丰富,最后选择了开源实现 gorilla/websocket 项目地址

执行 go get github.com/gorilla/websocket 添加依赖

我们知道websocket由http升级而来,首先会发送附带Upgrade请求头的Http请求,所以我们需要在处理Http请求时拦截请求并判断其是否为websocket升级请求,如果是则调用 gorilla/websocket 库相应函数处理升级请求。

首相要创建Upgrader实例,该实例用于升级请求

其中 CheckOringin 是一个函数,该函数用于拦截或放行跨域请求。函数返回值为 bool 类型,即 true 放行, false 拦截。如果请求不是跨域请求可以不赋值,我这里是跨域请求并且为了方便直接返回 true

此时已经成功升级为websocket连接并获得一个conn实例,之后的发送接收操作皆有conn完成其类型为websocket.Conn。

首先向客户端发送消息使用 WriteMessage(messageType int, data []byte) ,参数1为消息类型,参数2消息内容

示例:

接受客户端消息使用 ReadMessage() 该操作会阻塞线程所以建议运行在其他协程上。该函数有三个返回值分别是,接收消息类型、接收消息内容、发生的错误当然正常执行时错误为 nil。一旦连接关闭返回值类型为-1可用来终止读操作。

示例:

同时可以为连接设置关闭连接监听,函数为 SetCloseHandler(h func(code int, text string) error) 函数接收一个函数为参数,参数为nil时有一个默认实现,其源码为:

可以看到作为参数的函数的参数为int和string类型正好和前端的close(long string)对应即前端调用close(long string)关闭连接后两个参数会被发送给后端并最终被 func(code int, text string) error 所使用。

示例:

则断开连接时将打印code和text

注意:要想使断连处理生效必须要有 ReadMessage() 操作否则不会触发断连处理操作。

以上是常用基础操作点击 官方API手册 学习更多。

最后:大幻梦森罗万象狂气断罪眼\ (••) /

toke过期失效 ---提示并跳转到登录页面

token过期自动跳转到登录页面

设置token有效期为2小时,超过两小时 token失效 ,接口返回结果:{code:0,msg:'token过期',}

每次路由跳转都会对token进行判断,设置一个全局的beforeEach钩子函数,如果token存在就跳到你所需要的页面,否则直接跳转到登录页面,让用户重新存取token

全局路由钩子:router.beforeEach

router.beforeEach(async (to, from, next) = {

        //获取token

        const hasToken = getToken()

        if (hasToken) {

            //token存在,如果当前跳转的路由是登录界面

            if (to.path === '/login') {

                // if is logged in, redirect to the home page

                next({

                    path: '/'

                })

            } else {

                //在这里,就拉去用户权限,判断用户是否有权限访问这个路由

            } catch (error) {

                // remove token and go to login page to re-login

                await store.dispatch('user/resetToken')

                Message.error(error || 'Has Error')

                next(`/login?redirect=${to.path}`)

            }

        } else {

            //token不存在

            if (whiteList.indexOf(to.path) !== -1) {

                //如果要跳转的路由在白名单里,则跳转过去

                next()

            } else {

                //否则跳转到登录页面

                next(`/login?redirect=${to.path}`)

            }

        }

    })

请求拦截 设置

import axios from 'axios'

import { MessageBox, Message } from 'element-ui'

import store from '@/store'

import { getToken } from '@/utils/auth'

const service = axios.create({

baseURL: process.env.VUE_APP_BASE_API,

timeout: 5000

})

//发送请求时把token携带过去

service.interceptors.request.use(

config = {

if (store.getters.token) {

  config.headers['sg-token'] = getToken()

}

return config

},

error = {

console.log(error)

return Promise.reject(error)

}

)

//请求响应

service.interceptors.response.use(

response = {

console.log(response.data)

const res = response.data

// token过期,重返登录界面

if (res.code === 0) {

  store.dispatch('user/logout').then(() = {

    location.reload(true)

  })

}

return res

},

error = {

Message({

  message: error.msg,

  type: 'error',

  duration: 5 * 1000

})

return Promise.reject(error)

}

)

export default service


文章标题:go语言请求拦截 go语言如何限制协程数量
链接URL:http://chengdu.cdxwcx.cn/article/doiggdp.html