更新设置,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 {}

猜你喜欢

转载自yuhuiblog6338999322098842.iteye.com/blog/2307514