本文作者:包子也沉默

session没落,现在的会话都是如何实现的?

包子也沉默 3年前 (2019-10-25) ( 10-25 ) 1505 0条评论
摘要: 样,web资源处理的就是用户各自的数据了。•HttpSession–Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hebtu666/article/details/102711678

什么是会话?

注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceLog{Stringvalue()def

  会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

ean<String>(ExceptionEnum.BUSINESS_ERROR,"新增学生异常!","新增失败!","");}通过对业务进行操作后,会写入数据库,界面查询:日志管理的完整

•会话过程中要解决的一些问题?

SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/chyanwu68/article/details/102703001操作日志对于程序员或管理员而言

–每个用户不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

ErpLog();erpLog.setErrorCode(0);erpLog.setIsDeleted(0);//请求信息HttpServletRequestrequest=ToolUtil.getR

–例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。

tem.out.println(code);return"getcookie";}@RequestMapping(path="/session/set",method=RequestMethod.GE

•Cookie

oggerFactory.getLogger(LogAspect.class);@AutowiredprivateErpLogServicelogService;@AutowiredObjectMap

–Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

());erpLog.setUsername(MySysUser.loginName());HashMap<String,String>browserMap=ToolUtil.getOsA

•HttpSession

术来实现对日志管理的实现。文章大致内容:1、基本概念2、基本应用3、日志管理实战对这几部分理解了,会对AOP的应用应该很轻松。一、基本概念项目描述Aspect(切面)跨越多个类的关注点的模块化,切面是

–Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

tterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)括号中各个pattern分别表示:修饰符匹配(modifi

总结:cookie存在客户端,session存在服务器端

,安全的writeValueAsString,否则走Object的toString方法params.append("").append(paramNames.get(i)).append(":").a

 通常结合使用。

on()")publicvoiddoAfterTask(){System.out.println(++step+"后置通知");}@AfterReturning(pointcut="operation

我们先用sprintboot演示一下cookie和session操作

户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。•Cookie–Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再

    @RequestMapping(path = "/cookie/set",method = RequestMethod.GET)
    @ResponseBody
    public String setCookie(HttpServletResponse httpServletResponse){
        Cookie cookie=new Cookie("code", CommunityUtil.generateUUID());
        cookie.setPath("/community/alpha");
        cookie.setMaxAge(60*10);
        httpServletResponse.addCookie(cookie);
        return "set cookie";
    }


    @RequestMapping(path = "/cookie/get",method = RequestMethod.GET)
    @ResponseBody
    public String getCookie(@CookieValue("code") String code){
        System.out.println(code);
        return "get cookie";
    }


    @RequestMapping(path = "/session/set", method = RequestMethod.GET)
    @ResponseBody
    public String setSession(HttpSession session){
        session.setAttribute("id",1);
        session.setAttribute("name","Test");
        return "set session";
    }


    @RequestMapping(path = "/session/get", method = RequestMethod.GET)
    @ResponseBody
    public String getSession(HttpSession session) {
        System.out.println(session.getAttribute("id"));
        System.out.println(session.getAttribute("name"));
        return "get session";
    }

其实session的没落是和分布式有关的,随着服务器要处理的请求越来越多,我们不得不分布式部署,减小服务器压力。

)方法名匹配(name-pattern)可以指定方法名或者代表所有,set代表以set开头的所有方法参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也

为了负载均衡,我们一般采用nginx来分发请求给各个服务器处理

ttpMethod(request.getMethod());erpLog.setClassMethod(joinPoint.getSignature().getDeclaringTypeName()

但是这样session是无法共享的。

(JoinPointjoinPoint){//获取当前调用时间startTime.set(newDate());}/***正常情况返回**@paramjoinPoint切入点*@paramrvt正常结

(粘性session)

服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当

你可以设置nginx的分配策略,下次同一个还让同一个服务器来处理

段。SpringAOP允许您向任何建议的对象引入新的接口(和相应的实现)。例如,您可以使用介绍使bean实现IsModified接口,以简化缓存Targetobject(目标)由一个或多个切面通知的对

但是很显然,这就和分布式和nginx初衷违背了:负载很难保证均衡。

);//请求的方法参数名称LocalVariableTableParameterNameDiscovereru=newLocalVariableTableParameterNameDiscoverer

(同步session)

inx来分发请求给各个服务器处理但是这样session是无法共享的。(粘性session)你可以设置nginx的分配策略,下次同一个还让同一个服务器来处理但是很显然,这就和分布式和nginx初衷违背了

一台服务器的session给所有服务器复制一份

.getMessage());}/***环绕通知需要携带ProceedingJoinPoint类型的参数*环绕通知类似于动态代理的全过程ProceedingJoinPoint类型的参数可以决定是否执行

第一,性能不好。第二,产生了一定的耦合

ntjoinPoint,Objectrvt)throwsException{handleLog(joinPoint,null,rvt);}/***异常信息拦截**@paramjoinPoint*@pa

(专门session)

常结合使用。我们先用sprintboot演示一下cookie和session操作@RequestMapping(path="/cookie/set",method=RequestMethod.GET)

专门一台服务器来解决,存session,其它服务器来这个服务器取session再用。

ervice中所有的公有方法3)execution(*com.savage.server….(…))//表示匹配com.savage.server包及其子包下的所有方法三、日志管理实战有了上面基本应用

但是也有问题:你这个服务器挂了怎么办?别的服务器都是依赖这个服务器工作的。我们分布式部署本来就是为了解决性能的瓶颈啊。

解决,存session,其它服务器来这个服务器取session再用。但是也有问题:你这个服务器挂了怎么办?别的服务器都是依赖这个服务器工作的。我们分布式部署本来就是为了解决性能的瓶颈啊。很容易想到,我

很容易想到,我们把那个处理session的服务器搞个集群:

tjoinPoint,Exceptione)throwsException{handleLog(joinPoint,e,null);}@AsyncprivatevoidhandleLog(finalJ

更不行,想想就知道,本来就是为了解决分布式部署的问题,你把单独解决session的服务器又搞集群,和之前有什么区别呢?还不如一个服务器存一份简单呢。

ngframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dep

(存数据库)

;erpLog.setResponseValue(retString.length()>5000?JsonUtil.bean2Json("请求参数数据过长不与显示"):retString);if

可以,但是传统的关系数据库是存到硬盘里,速度太慢。

ethod(joinPoint);Loglog=getAnnotationLog(method);if(log==null){return;}Datenow=newDate();//操作数据库日志表E

(nosql)

g(path="/cookie/get",method=RequestMethod.GET)@ResponseBodypublicStringgetCookie(@CookieValue("code"

最终,我们的主流办法使用nosql数据库,比如redis,来解决这个问题的。

序。二、基本应用声明通知大家可以将下面的代码复制出来,验证上面的执行顺序。@AspectpublicclassTest{privatestaticintstep=0;@Pointcut("@annot

 

=startTime.get();erpLog.setStartTime(stime);erpLog.setEndTime(now);erpLog.setExecuteTime(now.getTime

文章版权声明:除非注明,否则均为本站原创文章,转载或复制请以超链接形式并注明出处。
分享到:
赞 (0

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

发表评论

快捷回复:

评论列表 (有 0条评论, 1505人围观) 参与讨论