拦截器--检查有没有注解标记,有的话进行操作(更新设置,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 {}
相关推荐
1、前后端分离(没有session和cookie,只有token),方便微信,APP端等二次开发。每个角色可以控制在多个模块或者混合模块(如XX模块的新增,OO模块的更新) 2、预览地址:http://121.42.8.166:8888 二、功能特点 ...
1、前后端分离(没有session和cookie,只有token),方便微信,APP端等二次开发。每个角色可以控制在多个模块或者混合模块(如XX模块的新增,OO模块的更新) 2、预览地址:http://121.42.8.166:8888 二、功能特点 ...
- 应用程序需要设置合理的session过期时间,以保护用户会话不被长时间占用。 6. **错误处理和调试**: - 在`LoginApiController`中,需要对可能出现的错误进行捕获和处理,例如网络问题、微信服务器返回的错误码...
- 电商系统通常支持PC、移动APP、移动Web和微信小程序等多种访问方式。 - 电商后台管理系统主要负责用户账户、商品分类、商品信息、订单、数据统计等业务的管理。 - 系统采用前后端分离的开发模式,前端使用Vue....
浏览器+app+pc,这种多终端开发,是很好的选择。 如果可以,新系统不再使用session保存用户信息。对于我们自己的platina开发平台,可以平滑过渡到jwet,让开发人员感觉不到。 JWT有什么好处? 1、支持跨域访问: ...
- **Ymm** 和 **ymm_wx**: 控制Web项目,分别用于后台项目和PC页面,同时也为WX APP提供接口。 - **Ymm_serv** 和 **ymm_goo**: 两个服务模块,分别对应不同的数据源,实现垂直拆分。 - **分布式系统水平拆分**: ...