`
y806839048
  • 浏览: 1145668 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

更新设置,session,token(PC,APP)

 
阅读更多

 拦截器--检查有没有注解标记,有的话进行操作(更新设置,session,token,服务器给我们web设置session,token的就是用的这种原理)

1,服务生成session,token,在客户端登陆成功的时候将session,token返回给客户端(同时服务器会自己存下一份在map(K-V)中),客户端存在浏览器中(cookie),session就存在服务器的当前线程中(threadlocal)

2,客户端在请求的时候,把自己的sessiion,token,作为参数参数一起带到服务器请求

3,服务器将客户端的K用来获取自己的V,再将客户端的V和自己用客户端K从map获取的V比较,匹配的就放行,同时刷新session(防止sesion失效)(权限就相当于用于app端的注解标签)

用这个我们给app做接口时候也是如此(拦截器+上标签标记)(拦截所有请求,有此标签的就处理此逻辑)

在自己写工具类保存session等信息的时候也是拦截器,拦截到就保存一次session(这样可以拦截所有用户的请求,至于刷新我们Pc端自己会有操作就会刷新,我们不必关心)

真正用户保存在session中的就是一个地方---在登录的时候,拦截器(工具类)只是不断保存此线程sesson,并负责取出

 

 

//这样没有权限的session验证不了,直接复制链接的没有session信息的不能登录

 

在登录的时候保存到session,专门用一个工具类拦截保存此session(session的操作是叠加的(同一个session)),并且通过这个工具类获取,

 

                        // threadlocal可以保存字符串,也可以保存对象,保存对像的时候,用泛型声明即可,记得将此类的对象set如

这样达到当前变量保存在当前线程中,取得化由于是拿到当前threadLocal,之后的当然是当前程中的

private static ThreadLocal<WebInfo> threadLocal = new NamedThreadLocal<WebInfo>("SpringWebHolder");

   @Override

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

WebInfo webInfo=new WebInfo(request,response);

threadLocal.set(webInfo);

return super.preHandle(request, response, handler);

   }

 

===================================================================

 

 

package com.esteel.until;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

import org.springframework.core.NamedThreadLocal;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

 

 

 

public class SpringWebHolder extends HandlerInterceptorAdapter {

    private static ThreadLocal<WebInfo> threadLocal = new NamedThreadLocal<WebInfo>("SpringWebHolder");

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        WebInfo webInfo=new WebInfo(request,response);

        threadLocal.set(webInfo);

        return super.preHandle(request, response, handler);

    }

    public static HttpServletRequest getRequest() {

      return threadLocal.get().getRequest();

    }

 

    public static HttpServletResponse getResponse() {

        return threadLocal.get().getResponse();

    }

 

    public static HttpSession getSession() {

        return threadLocal.get().getRequest().getSession();

    }

 

    public static User getCurrentUser() {

        return (User) threadLocal.get().getRequest().getSession().getAttribute("LOGIN_USER");

    }

 

    public static Employee getCurrentEmployee() {

        return (Employee) threadLocal.get().getRequest().getSession().getAttribute("CURR_EMPLOYEE");

    }

    public static Long getCurrentPlatFormId() {

        return (Long) threadLocal.get().getRequest().getSession().getAttribute("CURR_PLATFORM_ID");

    }

   private class WebInfo{

       private HttpServletRequest request;

       private HttpServletResponse response;

       public WebInfo(HttpServletRequest request,HttpServletResponse response){

           this.request=request;

           this.response=response;

       }

 

       public HttpServletRequest getRequest() {

          return this.request;

       }

 

       public HttpServletResponse getResponse() {

           return this.response;

       }

   }

}

 

 

 

 

======================================================

 

对于shiro来说他已经提供了这么一个工具类,只要在登录成功的地方调用此工具类即可

这里的过程相反:1工具类2,session,3保存进入用户等进入sesion,上面的工具类是1,用户写入session,2,sesion放入工具类、

本质一样都是threadlocal变;量

this.setSession("currentUser", user);//登录成功后

 

 

/**

* 将一些数据放到ShiroSession中,以便于其它地方使用

* @see 比如Controller,使用时直接用HttpSession.getAttribute(key)就可以取到

*/

private void setSession(Object key, Object value) {

Subject currentUser = SecurityUtils.getSubject();//当前线程的信息

if (null != currentUser) {

Session session = currentUser.getSession();

if (null != session) {

session.setAttribute(key, value);

}

}

 

 

获取:

                Subject currentUser = SecurityUtils.getSubject();

Session session1 = currentUser.getSession();//currentUser

OpmUser user=(OpmUser) session1.getAttribute("currentUser");

 

 

=========================

 

在springmvc中HttpServletRequest request, HttpServletResponse response,HttpSession session,Model model 等这些类似上下文信息服务器会自动传给mvc的跳转方法

 

 

@RequestMapping(value = "/account/tbCusFirmWeb/list")

public void tbConFeeList(TbCusFirmWebVo tbCusFirmWeb,Model model, HttpSession session, HttpServletRequest request)

 

}

@RequestMapping("/account/tbCusFirmWeb/basbedList")

public void  spsxList(@RequestParam(value = "warekind_key", required = false) String warekind_key,

            HttpServletRequest request,HttpServletResponse response,Model model) throws EsteelException {}

分享到:
评论

相关推荐

    ASP.NET LayUI权限管理系统源码

    1、前后端分离(没有session和cookie,只有token),方便微信,APP端等二次开发。每个角色可以控制在多个模块或者混合模块(如XX模块的新增,OO模块的更新) 2、预览地址:http://121.42.8.166:8888 二、功能特点 ...

    ASP.NET权限管理系统源码

    1、前后端分离(没有session和cookie,只有token),方便微信,APP端等二次开发。每个角色可以控制在多个模块或者混合模块(如XX模块的新增,OO模块的更新) 2、预览地址:http://121.42.8.166:8888 二、功能特点 ...

    微信PC端扫码控制器代码

    - 应用程序需要设置合理的session过期时间,以保护用户会话不被长时间占用。 6. **错误处理和调试**: - 在`LoginApiController`中,需要对可能出现的错误进行捕获和处理,例如网络问题、微信服务器返回的错误码...

    06-Vue全家桶-项目实战1

    - 电商系统通常支持PC、移动APP、移动Web和微信小程序等多种访问方式。 - 电商后台管理系统主要负责用户账户、商品分类、商品信息、订单、数据统计等业务的管理。 - 系统采用前后端分离的开发模式,前端使用Vue....

    基于E2EE的无状态认证JsonWebToken算法、常用Web算法模块-易语言

    浏览器+app+pc,这种多终端开发,是很好的选择。 如果可以,新系统不再使用session保存用户信息。对于我们自己的platina开发平台,可以平滑过渡到jwet,让开发人员感觉不到。 JWT有什么好处? 1、支持跨域访问: ...

    分布式架构项目介绍

    - **Ymm** 和 **ymm_wx**: 控制Web项目,分别用于后台项目和PC页面,同时也为WX APP提供接口。 - **Ymm_serv** 和 **ymm_goo**: 两个服务模块,分别对应不同的数据源,实现垂直拆分。 - **分布式系统水平拆分**: ...

Global site tag (gtag.js) - Google Analytics