webapi 携带session_webapi session - CSDN
精华内容
参与话题
  • c# WebApi之身份验证:Basic基础认证

    千次阅读 2017-11-27 14:58:22
    为什么需要身份认证身份认证是为了提高接口访问的安全性,如果没有身份验证,那么任何匿名用户只要知道服务器的url,就可以随意访问服务器,从而访问或者操作数据库,这会是很恐怖的事。...用户登录,登录成功后将生成...

    WebApi相关文章:

    为什么需要身份认证

    身份认证是为了提高接口访问的安全性,如果没有身份验证,那么任何匿名用户只要知道服务器的url,就可以随意访问服务器,从而访问或者操作数据库,这会是很恐怖的事。

    什么是Basic基础认证

    Basic基础认证是一种简单的用户名、密码验证过程,它的主要原理是加密用户信息,生成票据,每次需要身份验证时将票据带过来验证,实现步骤为:

    1. 用户登录,登录成功后将生成的票据返回到前端;
    2. 前端登录成功后,收到票据信息,跳转到主页面,并且吧票据一并带过去,存入Session;
    3. 在需要请求页面,把票据信息加入到请求的Head里面,将票据信息随着请求一起发送到服务端去;
    4. 在WebApi服务里面定义一个类,继承AuthorizeAttribute类,然后重写父类的OnAuthorization方法,在OnAuthorization方法里面取到当前http请求的Head,从Head里面取到我们前端传过来的票据信息。解密票据信息,从解密的信息里面得到用户名和密码,然后验证用户名和密码是否正确。如果正确,表示验证通过,否则返回自定义错误信息。

    Basic基础认证的代码示例:

    首先新建两个项目:Web测试站点、WebApi站点
    这里写图片描述

    1.1、在Web测试站点,添加一个登录页面:

    <div style="text-align:center;">
            <div>用户名:<input type="text" id="txt_username" /></div>
            <div>密  码:<input type="password" id="txt_password" /></div>
            <div><input type="button" value="登录" id="btn_login" class="btn-default" /></div>
        </div>

    登录请求的ajax:

     $(function () {
        $("#btn_login").click(function () {
            $.ajax({
                type: "get",
                url: "http://localhost:61593/api/account/login",
                data: { strUser: $("#txt_username").val(), strPwd: $("#txt_password").val() },
                success: function (data, status) {
                    if (status == "success") {
                        if (!data.bRes) {
                            alert("登录失败");
                            return;
                        }
                        alert("登录成功");
                        //登录成功之后将用户名和用户票据带到主界面
                        window.location = "/Home/Index?UserName=" + data.UserName + "&Ticket=" + data.Ticket;
    
                    }
                },
                error: function (e) {
                },
                complete: function () {
    
                }
    
            });
        });
    });

    1.2、对应的WebApi站点的,登录的Api接口:

    /// <summary>
    /// 用户登录
    /// </summary>
    /// <param name="strUser"></param>
    /// <param name="strPwd"></param>
    /// <returns></returns>
    [HttpGet]
    public object Login(string strUser, string strPwd)
    {
        if (!ValidateUser(strUser, strPwd))
        {
            return new { bRes = false };
        }
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(0, strUser, DateTime.Now,
                        DateTime.Now.AddHours(1), true, string.Format("{0}&{1}", strUser, strPwd),
                        FormsAuthentication.FormsCookiePath);
        //返回登录结果、用户信息、用户验证票据信息
        var oUser = new UserInfo { bRes = true, UserName = strUser, Password = strPwd, Ticket = FormsAuthentication.Encrypt(ticket) };
        //将身份信息保存在session中,验证当前请求是否是有效请求
        HttpContext.Current.Session[strUser] = oUser;
        return oUser;
    }
    
    //校验用户名密码(正式环境中应该是数据库校验)
    private bool ValidateUser(string strUser, string strPwd)
    {
        if (strUser == "admin" && strPwd == "123456")
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    自定义UserInfo实体:

    public class UserInfo
    {
        public bool bRes { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Ticket { get; set; }
    }

    新建的WebApi需要配置一下路由,打开App_Start文件夹下的WebApiConfig.cs文件,添加一条路由信息:

    public static void Register(HttpConfiguration config)
    {
        //解决跨域访问问题
        config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
    
        // Web API 路由
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi1",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

    如果是两个站点的话可能会出现跨域问题,解决跨域访问问题可以参考:
    http://blog.csdn.net/lwpoor123/article/details/78457589

    2.1、在Web测试站点添加一个用于跳转测试的index主页面

    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
        <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    </head>
    <body>
        测试结果:
        <div id="div_test">
            hello world
        </div>
        当前登录用户:
        <div id="username">
            @ViewBag.UserName
        </div>
    </body>
    </html>

    ajax请求:

    <script>
        var ApiUrl = "http://localhost:61593/";
        $(function () {
            $.ajax({
                type: "get",
                url: ApiUrl + "api/Account/GetAllData",
                data: {},
                beforeSend:function(XHR){                XHR.setRequestHeader('Authorization','BasicAuth @ViewBag.Ticket')
                },
                success: function (data, status) {
                    if (status == "success") {
                        $("#div_test").html(data);
                    }
                },
                error: function (e) {
                    $("#div_test").html("Error");
                }
            });
        });
    </script>

    这里需要注意在beforeSend方法里面,向请求的报文头里面增加票据信息,用于把Ticket信息一同带到服务器:
    XHR.setRequestHeader(‘Authorization’,’BasicAuth @ViewBag.Ticket’)
    这里写图片描述

    2.2、index页面的action,接收传递过来的票据数据,存入Session

    public ActionResult Index(string UserName, string Ticket)
    {
        if (UserName != null)
        {
            Session["UserName"] = UserName;
        }
        if (Ticket != null)
        {
            Session["Ticket"] = Ticket;
        }
    
        ViewBag.UserName = Session["UserName"];
        ViewBag.Ticket = Session["Ticket"];
        return View();
    }

    2.3、对应的Api接口:

    public class AccountController : ApiController
    {
        /// <summary>
        /// 得到所有数据
        /// </summary>
        /// <returns>返回数据</returns>
        [HttpGet]
        [RequestAuthorize]
        public string GetAllData()
        {
            return "Success";
        }
    }

    WebAip默认是没有开启Session,需要手动开启:
    在WebApi站点,打开Global.asax文件,重写Init()方法

    public override void Init()
    {
        this.PostAuthenticateRequest += (sender, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
        base.Init();
    }

    或者:

    public override void Init()
    {
        PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest;
        base.Init();
    }
    
    void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
    {
        HttpContext.Current.SetSessionStateBehavior(
            SessionStateBehavior.Required);
    }

    3.1、WebApi身份验证部分(重点)
    在WebApi站点,添加一个RequestAuthorizeAttribute.cs文件,继承AuthorizeAttribute,自定义此特性用于接口的身份验证:

     /// <summary>
    /// 自定义此特性用于接口的身份验证
    /// </summary>
    public class RequestAuthorizeAttribute : AuthorizeAttribute
    {
        //重写基类的验证方式,加入我们自定义的Ticket验证
        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            //从http请求的头里面获取身份验证信息,验证是否是请求发起方的ticket
            var authorization = actionContext.Request.Headers.Authorization;
            if ((authorization != null) && (authorization.Parameter != null))
            {
                //解密用户ticket,并校验用户名密码是否匹配
                var encryptTicket = authorization.Parameter;
                if (ValidateTicket(encryptTicket))
                {
                    base.IsAuthorized(actionContext);
                }
                else
                {
                    HandleUnauthorizedRequest(actionContext);
                }
            }
            //如果取不到身份验证信息,并且不允许匿名访问,则返回未验证401
            else
            {
                var attributes = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();
                bool isAnonymous = attributes.Any(a => a is AllowAnonymousAttribute);
                if (isAnonymous) base.OnAuthorization(actionContext);
                else HandleUnauthorizedRequest(actionContext);
            }
        }
    
        protected override void HandleUnauthorizedRequest(HttpActionContext actioncontext)
        {
            base.HandleUnauthorizedRequest(actioncontext);
    
            var response = actioncontext.Response = actioncontext.Response ?? new HttpResponseMessage();
            response.StatusCode = HttpStatusCode.Forbidden;
            var content = new
            {
                code = -1,
                success = false,
                errs = new[] { "服务端拒绝访问:你没有权限,或者掉线了" }
            };
            response.Content = new StringContent(Json.Encode(content), Encoding.UTF8, "application/json");
        }
    
        //校验用户名密码(正式环境中应该是数据库校验)
        private bool ValidateTicket(string encryptTicket)
        {
            //解密Ticket
            var strTicket = FormsAuthentication.Decrypt(encryptTicket).UserData;
    
            //从Ticket里面获取用户名和密码
            var index = strTicket.IndexOf("&");
            string strUser = strTicket.Substring(0, index);
            string strPwd = strTicket.Substring(index + 1);
    
            if (strUser == "admin" && strPwd == "123456")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    3.2、使用的时候只需要在控制器前面加上自定义的身份验证[RequestAuthorize]

    /// <summary>
    /// 得到所有数据
    /// </summary>
    /// <returns>返回数据</returns>
    [HttpGet]
    [RequestAuthorize]
    public string GetAllData()
    {
        return "Success";
    }

    这里写图片描述

    这里写图片描述

    这里写图片描述

    如果不携带票据或者票据无效,服务端拒绝访问:
    这里写图片描述

    如果在控制器加了身份验证,有些请求又不想使用验证,可以在方法上面添加特性标注[AllowAnonymous]

    [RequestAuthorize]
    public class AccountController : ApiController
    {
        /// <summary>
        /// 得到所有数据
        /// </summary>
        /// <returns>返回数据</returns>
        [HttpGet]
        public string GetAllData()
        {
            return "Success";
        }
    
        [AllowAnonymous]
        public string getData()
        {
            return "data";
        }
    }
    展开全文
  • c# .net mvc webapi Filters 筛选器中获取 请求参数和响应内容

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using Grass.Extend;
    
    namespace Grass.Mvc.Infrastructure.Filter
    {
        public class WebApiActionDebugFilter : System.Web.Http.Filters.ActionFilterAttribute
        {
            /// <summary>
            /// 是否开启调试
            /// </summary>
            private bool _isDebugLog = true;
    
            public string DebugId
            {
                set
                {
                    var session = System.Web.HttpContext.Current.Session;
                    if (session != null)
                    {
                        session["RequestDebugId"] = value;
                    }
                }
                get
                {
                    var session = System.Web.HttpContext.Current.Session;
                    if (session != null && session["RequestDebugId"]!=null)
                    {
                        return session["RequestDebugId"].ToString();
                    }
                    return string.Empty;
                }
            }
    
            public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext context)
            {
                base.OnActionExecuting(context);
                //记录请求内容
                if (_isDebugLog)
                {
                    try
                    {
                        var guid = System.Guid.NewGuid().ToString();
                        DebugId = guid;
                        var session = System.Web.HttpContext.Current.Session;
                        var request = System.Web.HttpContext.Current.Request;
                        var keys = request.Form.AllKeys;
                        
                        var task = context.Request.Content.ReadAsStreamAsync();
                        var content = string.Empty;
                        using (System.IO.Stream sm = task.Result)
                        {
                            if (sm != null)
                            {
                                sm.Seek(0, SeekOrigin.Begin);
                                int len = (int) sm.Length;
                                byte[] inputByts = new byte[len];
                                sm.Read(inputByts, 0, len);
                                sm.Close();
                                content = Encoding.UTF8.GetString(inputByts);
                            }
                        }
                        string pars = string.Format("请求:\r\n id = {3};\r\n sessionId = {0};\r\n url = {1};\r\n contentType = {4};\r\n content = {2};"
                            ,""// (session==null)?"...":session.SessionID
                            , request.RawUrl
                            , content
                            , guid
                            , request.ContentType);
    
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
            public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext context)
            {
                base.OnActionExecuted(context);
                //记录请求内容
                if (_isDebugLog)
                {
                    try
                    {
                        var session = System.Web.HttpContext.Current.Session;
                        var task = context.Response.Content.ReadAsStringAsync();
                        var txt = task.Result;
                        string pars = string.Format("响应:\r\n id = {2};\r\n sessionId = {0};\r\n response = {1}"
                            , ""//(session == null) ? "..." : session.SessionID
                            , txt
                            , DebugId);
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
            
        }
    }


    展开全文
  • 1. Spring Session 简介

    万次阅读 2019-08-27 16:15:26
    Spring session 是用来解决分布式环境下的session共享问题的. 不仅支持HttpSession, 也支持WebSession和WebSocket. 不过笔者基本上没使用过WebSession和...spring session 提供了管理用户session信息的API和实现,...

    Spring session 是用来解决分布式环境下的session共享问题的. 不仅支持HttpSession, 也支持WebSession和WebSocket. 不过笔者基本上没使用过WebSession和WebSocket, 所以笔者只介绍HttpSession 的用法.

    1. Spring Session 简介

    spring session 提供了管理用户session信息的API和实现, 可以灵活地选择. spring session 不仅仅支持Httpsession的分布式共享, 也支持WebSocket 和 WebSession. 看官网描述

    • HttpSession: Allows replacing the HttpSession in an application container-neutral way, with support for providing session IDs in headers to work with RESTful APIs.
    • WebSocket: Provides the ability to keep the HttpSession alive when receiving WebSocket messages
    • WebSession: Allows replacing the Spring WebFlux’s WebSession in an application container-neutral way.

    2. spring session 存储模式

    spring session 的核心是session中心化存储, spring session 支持多种存储方式, 比如jdbc, mongodb, redis等方式. 不过笔者强烈推荐使用redis, 其原因有:

    • redis 属于nosql 数据库, 无需初始化任何表
    • redis 拥有自动管理key的过期的功能, 这个和session超时机制很像
    • redis 性能非常高

    3. 使用场景

    • session 数据迁移: 如果应用需要在session中存储大量数据时, 然而jvm 的最大内存有限制, 则可以利用spring session将session 数据存储在redis 中
    • session 共享: 当多个应用需要session共享时, 可以将session进行中心化存储, 都存储在redis 中

    4. spring session 的两种SessionId 解析器

    spring session 拥有两种sessionId解析器: HeaderHttpSessionIdResolver 和 CookieHttpSessionIdResolver

    • CookieHttpSessionIdResolver 和 HeaderHttpSessionIdResolver 均为sessionId 的解析器.
    • CookieHttpSessionIdResolver 会从请求携带的Cookie中解析名为SESSION的Cookie, 然后进行base64为解码, 解码后的值为sessionId; 响应结束时, 将sessionId, 以Set-Cookie:SESSION 存入header, 然后返回给客户端
    • HeaderHttpSessionIdResolver 会从请求头中解析headerName 为x-Auth-Token 或 authenticationInfo 的值, 解析的值即为sessionId; 响应结束后, 将sessionId, 以x-Auth-Token或authenticationInfo 存入header, 然后返回客户端.

    5. Spring session的两种刷新模式

    • ON_SAVE: 只有当SessionRepository.save(Session)方法被调用时, 才会将session中的数据同步到redis中. 在web 应用中, 当请求完成响应后, 才开始同步. 也就是说在执行response 之前session数据都是缓存在本地的.
    • IMMEDIATE: 实时同步session 数据到redis. 当执行SessionRepository.createSession()时, 会将session数据同步到redis中; 当对session的attribute进行set/remove 等操作时, 也会同步session中的数据到redis中.
    展开全文
  • 3. Spring Session Restful 风格API

    万次阅读 2019-08-27 16:15:18
    在Java web应用, Session 会话保持是依靠浏览器传入一个name为SESSON的cookie而实现的, 默认情况下, spring session 也是采用基于这种方式实现的, spring session会解析请求对象中的cookie. 而Restful风格的API, ...

    在Java web应用, Session 会话保持是依靠浏览器传入一个name为SESSON的cookie而实现的, 默认情况下, spring session 也是采用基于这种方式实现的, spring session会解析请求对象中的cookie. 而Restful风格的API, 倡导的时无状态的请求, 也就是说没有会话保持这个概念的, 即没有session的概念. 通常会采取每个请求都传递一个token 来实现认证参数的传递. spring session对Restful 风格的API 也提供了支持, 可以将Token 存入request Header 中

    1. spring session 的两种SessionId 解析器

    1.1 HeaderHttpSessionIdResolver VS CookieHttpSessionIdResolver

    • CookieHttpSessionIdResolver 和 HeaderHttpSessionIdResolver 均为sessionId 的解析器.
    • CookieHttpSessionIdResolver 会从请求携带的Cookie中解析名为SESSION的Cookie, 然后进行base64为解码, 解码后的值为sessionId; 响应结束时, 将sessionId, 以Set-Cookie:SESSION 存入header, 然后返回给客户端
    • HeaderHttpSessionIdResolver 会从请求头中解析headerName 为x-Auth-Token 或 authenticationInfo 的值, 解析的值即为sessionId; 响应结束后, 将sessionId, 以x-Auth-Token或authenticationInfo 存入header, 然后返回客户端.

    1.2 CookieHttpSessionIdResolver 响应头信息

    Set-Cookie:SESSION=M2ZlNzA3YjItNmQzZi00YjkzLThmNjItYTI3MzY5ODQzYzJl; Path=/; HttpOnly; SameSite=Lax
    Content-Type:text/plain;charset=UTF-8
    Content-Length:66
    Date:Wed, 17 Apr 2019 06:10:34 GMT
    

    1.3 HeaderHttpSessionIdResolver 响应头信息

    X-Auth-Token:b9088e9e-3547-48d2-b60a-245835e5c198
    Content-Type:text/plain;charset=UTF-8
    Content-Length:66
    Date:Wed, 17 Apr 2019 05:52:22 GMT
    

    2. 测试HeaderHttpSessionIdResolver

    2.1 配置HeaderHttpSessionIdResolver 解析器

    • 只需要在Spring 容器中注入HeaderHttpSessionIdResolver 解析器即可, 默认注入的是CookieHttpSessionIdResolver
    • HeaderHttpSessionIdResolver 有两个静态方法用于返回解析器实例:
      • xAuthToken: 响应头中通过x-Auth-Token 存放sessionId
      • authenticationInfo: 响应头中通过 Authentication-Info 存放sessionId
    @Bean
    public HttpSessionIdResolver httpSessionIdResolver() {
        return HeaderHttpSessionIdResolver.xAuthToken();
    }
    

    1.2 定义Restful 接口

    • spring 使用RestController 来定于Restful 风格的API
    @RestController
    @RequestMapping("/rest/hello")
    public class RestHelloController {
    
        @GetMapping("/say.json")
        public String say() {
    
            String result = "sessionId:" + session.getId() + "\n session.isNew:" + session.isNew();
    
            return result;
        }
    }
    

    3. 测试

    3.1 添加依赖

    由于浏览器中直接输入网址方式没有办法设置请求头携带x-Auth-Token, 所以笔者使用HttpClient 来进行接口调用

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.6</version>
    </dependency>
    

    3.2 测试用例

    • 笔者使用HttpClient 创建两个两个测试用例, test()请求头中不携带参数x-Auth-Token, 另一个请求头中携带x-Auth-Token.
    • x-Auth-Token的值并不是随便设置的, 而是从之前的请求响应中获取的
    public class TestHttpUtilRestuful {
    
        String url = "http://localhost:8180/rest/hello/say.json"; 
    
        // 请求参数不携带x-Auth-Token, 每次获取的都是新的token
        @Test
        public void test(){
    
            HttpGet httpGet = new HttpGet(url);
    
            CloseableHttpClient httpClient = HttpClients.createDefault();
    
            try {
                CloseableHttpResponse response = httpClient.execute(httpGet);
    
                System.out.println("\n******************** 响应 ********************");
                String result = EntityUtils.toString(response.getEntity());
                System.out.println("response:" + result);
    
                // 返回header 信息
                for (Header header : response.getAllHeaders()) {
                    System.out.println(header.getName() + ":" + header.getValue());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        // 请求参数携带接口返回的x-Auth-Token, 则返回session 为已存在token
        @Test
        public void test_with_header(){
    
            // 使用token 测试
            String xAuthToken = "d075cdbd-87d4-46b8-b52f-a89b86edd25a2";
    
            HttpGet httpGet = new HttpGet(url);
    
            CloseableHttpClient httpClient = HttpClients.createDefault();
    
            try {
    
                httpGet.setHeader("X-Auth-Token", xAuthToken);
    
                CloseableHttpResponse response = httpClient.execute(httpGet);
    
                System.out.println("\n******************** 响应 ********************");
                String result = EntityUtils.toString(response.getEntity());
                System.out.println("response:" + result);
    
                // 返回header 信息
                for (Header header : response.getAllHeaders()) {
                    System.out.println(header.getName() + ":" + header.getValue());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    3.3 测试结果-未携带header

    • 请求响应头中, 会新增x-Auth-Token, 值为sessionId. 如果不开启Restful支持的话, 响应头中不会包含此参数.
    • 请求Header不携带x-Auth-Token, 则每次请求都会新创建一个session. 响应结果中session.isNew 为true.
    response:sessionId:b9088e9e-3547-48d2-b60a-245835e5c198
     session.isNew:true
    X-Auth-Token:b9088e9e-3547-48d2-b60a-245835e5c198
    Content-Type:text/plain;charset=UTF-8
    Content-Length:66
    Date:Wed, 17 Apr 2019 05:52:22 GMT
    

    3.4 携带header

    • 将x-Auth-Token 修改为已存在token, 查看输出session.isNew 为false, 证明已不是新的session
    • 如果x-Auth-Token 设置的值不存在, 则spring session 会创建一个新的session, 返回session.isNew 为true
    response:sessionId:b9088e9e-3547-48d2-b60a-245835e5c198
    session.isNew:false
    Content-Type:text/plain;charset=UTF-8
    Content-Length:67
    Date:Wed, 17 Apr 2019 05:52:58 GMT
    
    展开全文
  • api 接口 shiro 权限控制 springmvc

    千次阅读 2018-07-31 11:19:27
    采用前后端分离的方式,前端api接口访问,后端通过shiro权限控制。 设置跨域访问后,ajax携带cookie需要设置允许的access-orign。 可通过如下设置动态的。 // filter 中设置 if(request.getHeader("Origin&...
  • session 的工作原理?

    千次阅读 2020-02-04 15:53:56
    session 的工作原理? 1、什么是 session session 是浏览器和服务器会话过程中,服务器分配的一块储存空间。服务器默认为浏览器在cookie中设置sessionid,浏览器在向服务器请求过程中传输 cookie 包含 sessionid ...
  • 【面试】——session和cookie 区别

    千次阅读 2019-08-28 09:17:29
    session 原理: 1、session是保存在服务器端,理论上是没有是没有限制,只要你的内存够大 2、浏览器第一次访问服务器时会创建一个session对象并返回一个JSESSIONID=ID的值, 创建一个Cookie对象key为JSSIONID,...
  • 最近在开发项目的过程中,遇到android与web服务器要在同一session下通信的问题。 在解决问题前先回顾下Session与Cookie: Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决...
  • WebService加密

    千次阅读 2009-01-07 13:16:00
    众所周知,WebService访问API是公开的,知道其URL者均可以研究与调用。那么,在只允许注册用户的WebService应用中,如何确保API访问和通信的安全性呢?本文所指的访问与通信安全性包括:访问安全性:当前访问者是...
  • RESTful API使用JWT做无状态的身份认证

    千次阅读 2020-06-29 18:36:38
    JWT设计RESTful架构的前后端,天然要求API是无状态的,JWT(JSON Web Token)简单易用,适合在分布式系统中做API无状态的身份认证。jwt由Header、Payload、Signature三部分组成,使用 . 分割开,一个JWT形式:Header....
  • 深入理解cookie与session

    千次阅读 2014-10-07 18:17:03
    cookie和session
  • (原创文章,转载请注明来源:http://blog.csdn.net/hulihui)众所周知,WebService访问API是公开的,知道其URL者均可以研究与调用。那么,在只允许注册用户的WebService应用中,如何确保API访问和通信的安全性呢?...
  • 我们今天就来了解下在小程序中,如何做用户登录,以及如何去维护这个登录后的会话(Session)状态。在微信小程序中,我们大致会涉及到以下三类登录方式: 自有的账号注册和登录; 使用其他第三方平台账号登录; ...
  • 前后端分离中session问题

    千次阅读 2018-08-24 05:15:03
    起因在公司业务中,使用的前后端分离开发。但是因为是第一次用,在做AOP日志记录的时候,发现当用户登录的时候把用户信息存在session中,在AOP方法中获取的session。但是这两个sessionsessionId并不相...
  • 我们今天就来了解下在小程序中,如何做用户登录,以及如何去维护这个登录后的会话(Session)状态。下面来看看详细的介绍: 小程序的登陆流程 微信小程序的登陆涉及到的有三剑客有: 小程序客户端 微信服务器 ...
  • Token原理以及应用

    万次阅读 多人点赞 2016-07-23 19:38:36
    近期由于项目需要开发供第三方使用的api,在整个架构设计的一个环节中,对api访问需要进行认证,在这里我选择了token认证。 一:token的优势(此部分引自http://www.sumahe.cn/)  1.无状态、可扩展  在客户端...
  • session、cookie、token 详解

    万次阅读 2019-06-19 17:17:09
    1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了HTTP...
  • 前言:  本篇文章是以实际生产中遇到的问题为导向写的,所以在体系上没有那么详细。请各位看官多多包涵,若有不当之处欢迎批评指正。   1.为什么要有cookie/...比如web系统常用的用户登录功能,如果没有cooki...
  • cookie、sessionStorage和localStorage的区别

    万次阅读 多人点赞 2019-05-30 21:29:47
    1)webstorage是本地存储,存储在客户端,包括localStorage和sessionStorage 2)localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。存放数据大小...
1 2 3 4 5 ... 20
收藏数 9,783
精华内容 3,913
关键字:

webapi 携带session