java结合wabacus实现session共享(第二版)

2024-08-31 15:18

本文主要是介绍java结合wabacus实现session共享(第二版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:该版相对于第一版有所改进。原因:每一版存在session覆盖问题,分析如下:

request().getServletContext().setAttribute("globelSession", session);

我们可以把globelSession想象成是索引,或某一搜索条件。每一次请求都搜索名为globelSession的session,而globelSession是指定的,每一次set的session都名为globelSession,所以session将会被更新,即:覆盖。

解决办法:浏览器每一次请求所产生的sessionid都不重复,因此,我们可以将这个sessionid想象成主键ID或索引,ID不重复,查询出来的数据也不会是同一条,因此能够有效地避免session覆盖。代码如下:

HttpSession session = request().getSession();
request().getServletContext().setAttribute(session.getId(), session);

一、完整代码:

System.out.println("==============================启用SESSION共享(跨域)===============================");
HttpSession session = request().getSession();
session.setAttribute("userPA01", user.getPA01());
session.setAttribute("userName", user.getUserName());
// 注意这里,要传递sessionID过去,目的:避免session覆盖
request().getServletContext().setAttribute(session.getId(), session);
//request().getServletContext().setAttribute("globelSession",  session);
/*Cookie[] cookies = request().getCookies();
for (Cookie cookie : cookies) {
System.out.println("登录时cookies:"+cookie.getValue());
}*/
System.out.println("================================"+session.getId()+"==============================");

在另一个工程下新建servlet测试类Global.java

protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ServletContext context = request.getServletContext().getContext("/app2");HttpSession session = (HttpSession) context.getAttribute(session.getId());System.out.println("跨域获取到的" + session.getAttribute("userPA01"));
}

此时,需要修改web.xml文件,即:请求的入口

<!-- session跨域、共享(测试用) -->
<!-- <servlet><description>This is the description of my J2EE component</description><display-name>This is the display name of my J2EE component</display-name><servlet-name>Global</servlet-name><servlet-class>com.perfect.util.Global</servlet-class>
</servlet>
<servlet-mapping><servlet-name>Global</servlet-name><url-pattern>/*</url-pattern>
</servlet-mapping> -->

server.xml配置:

<Context docBase="D:\WorkSpace\WabacusBlank\WebRoot" path="/OA" reloadable="true" crossContext="true" sessionCookiePath="/"/>
<Context docBase="D:\WorkSpace\PerfectOA\target\oa" path="/" reloadable="true" crossContext="true" sessionCookiePath="/"/>

当你启动app1工程并登录后,运行app2即可获取app1共享的session。

二、在wabacus中的用法,必须遵循wabacus的语法

首先,在wabacus.cfg.xml中配置全局拦截器,代码如下:

<!-- 配置全局拦截器 -->
<global-interceptors><interceptor class="com.perfect.interceptor.DataSessionIntercetor"/>
</global-interceptors>

创建拦截器DataSessionIntercetor.java

package com.perfect.interceptor;import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;import com.wabacus.system.ReportRequest;
import com.wabacus.system.intercept.AbsPageInterceptor;public class DataSessionIntercetor extends AbsPageInterceptor {public void doStart(ReportRequest rrequest) {System.out.println("您进入拦截器!");System.out.println("++++++++++++++++++获取共享session信息如下:++++++++++++++++++");ServletContext context = rrequest.getRequest().getServletContext().getContext("/");
//		HttpSession session = (HttpSession) context.getAttribute("globelSession");String wabSessionID = rrequest.getRequest().getRequestedSessionId();System.out.println("wabacus操作动作产生的sessionid:" + wabSessionID);if (wabSessionID.indexOf("-") != -1) {rrequest.getRequest().getSession().setAttribute("sessionid", wabSessionID);String sessionid = (String)rrequest.getRequest().getSession().getAttribute("sessionid");System.out.println("用户登录时产生的sessionid:" + sessionid);if (context != null) {HttpSession session = (HttpSession) context.getAttribute(sessionid);rrequest.getRequest().getSession().setAttribute("userid", session.getAttribute("userPA01"));rrequest.getRequest().getSession().setAttribute("username", session.getAttribute("userName"));System.out.println("当前用户ID(PA01):" + session.getAttribute("userPA01"));System.out.println("当前用户姓名:" + session.getAttribute("userName"));rrequest.setAttribute("userid", rrequest.getRequest().getSession().getAttribute("userid"));rrequest.setAttribute("username", rrequest.getRequest().getSession().getAttribute("username"));}}/*Cookie[] cookies = rrequest.getRequest().getCookies();for (Cookie cookie : cookies) {System.out.println("cookies:"+cookie.getValue());}*/}}

为什么会有wabSessionID.indexOf("-") != -1这样的判断?

因为浏览器访问不能服务时生成的sessionid会有所不同,如下图,每二个id才是登录时产生的sessionid,而第一个则是访问wabacus服务时产生的sessionid

1、在xml页面上的使用

<sql><value><![CDATA[SELECT (SELECT COUNT(*) c FROM A25 WHERE {#condition#}) c,c01,c02 FROM A25 WHERE {#condition#} order by c07 desc]]></value><condition name="userid" label="操作人" hidden="true" source="session{userid}"><value><![CDATA[c05 = '#data#']]></value></condition></sql>

2、在其它拦截器中使用

// ***************************当前用户操作**************************** //
String userPA01 = (String) rrequest.getRequest().getSession().getAttribute("userid");
String userName = (String) rrequest.getRequest().getSession().getAttribute("username");
// ****************************************************************** //

 

这篇关于java结合wabacus实现session共享(第二版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124270

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu