JAVA结合Wabacus实现Session共享(第一版)

嘉乐集团总公司 9月前 ⋅ 348 阅读

一、通过页面实现session共享(注:不适用于后台代码)

app1、app2同时部署在D:\apache-tomcat-8080\webapps下,类似于同时运行两个工程,而index1.jsp、index2.jsp分别放在app1、app2文件夹下面,期望:将app1工程的session共享给app2。内容如下:

app1/index1.jsp

<body>
<!-- 设置session值 -->
<%
	session.setAttribute("name", "lenian");
	String names = (String) session.getAttribute("name");
	application.setAttribute("globelSession",session);
%>
	您的用户名是app1:<%=names%>
</body>

app2/index2.jsp

<body>
<!-- 获取session值 -->
您的用户名是application:<%=((HttpSession)application.getContext("/app1").getAttribute("globelSession")).getAttribute("name") %>
</body>

二、spring boot与wabacus的结合(注:即使后台框架变了,原理也不会变)

/**
 * 登录认证
 */
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
	UsernamePasswordToken upToken = (UsernamePasswordToken) token;
	String username = upToken.getUsername();
	String password = "";
	if (upToken.getPassword() != null) {
		password = new String(upToken.getPassword());
	}
 
	User user = null;
	try {
		user = loginService.login(username, password);
		System.out.println("==============================启用SESSION共享===============================");
		HttpSession session = request().getSession();
		session.setAttribute("userPA01", user.getPA01());
		session.setAttribute("userName", user.getUserName());
		session.setAttribute("phoneNumber", user.getPhonenumber());
		session.setAttribute("loginName", user.getLoginName());
		session.setAttribute("email", user.getEmail());
		request().getServletContext().setAttribute("globelSession", session);
		HttpSession session2 = (HttpSession)request().getServletContext().getAttribute("globelSession");
		Object id = session2.getAttribute("userPA01");
		System.out.println("======================================="+id+"=========================================");
	} catch (CaptchaException e) {
		throw new AuthenticationException(e.getMessage(), e);
	} catch (Exception e) {
		log.info("对用户[" + username + "]进行登录验证..验证未通过{}", e.getMessage());
		throw new AuthenticationException(e.getMessage(), e);
	}
	SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName());
	return info;
}

必不可少

/**
 * new一个request
 * 
 * @return
 */
public static HttpServletRequest request() {
	HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
			.getRequest();
	return request;
}
 
/**
 * 获取当前请求session
 * 
 * @return
 */
public static HttpSession getHttpSession() {
	return request().getSession();
}

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

protected void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	ServletContext context = request.getServletContext().getContext("/app2");
	HttpSession session = (HttpSession) context.getAttribute("globelSession");
	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> -->

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

三、在wabacus中的用法,必须遵循wabacus的语法。如下:

新建一个拦截器DataSessionIntercetor.java,目的是用wabacus本身的方法set、get。

package com.perfect.interceptor;
 
import javax.servlet.ServletContext;
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");
		if (null != session) {
			rrequest.getRequest().getSession().setAttribute("userid", session.getAttribute("userPA01"));
			rrequest.getRequest().getSession().setAttribute("username", session.getAttribute("userName"));
			rrequest.getRequest().getSession().setAttribute("phonenumber", session.getAttribute("phoneNumber"));
			rrequest.getRequest().getSession().setAttribute("email", session.getAttribute("email"));
			rrequest.getRequest().getSession().setAttribute("login_name", session.getAttribute("loginName"));
			System.out.println("当前用户ID(PA01):" + session.getAttribute("userPA01"));
			rrequest.setAttribute("userid", rrequest.getRequest().getSession().getAttribute("userid"));
			rrequest.setAttribute("username", rrequest.getRequest().getSession().getAttribute("username"));
			rrequest.setAttribute("phonenumber", rrequest.getRequest().getSession().getAttribute("phonenumber"));
			rrequest.setAttribute("email", rrequest.getRequest().getSession().getAttribute("email"));
			rrequest.setAttribute("login_name", rrequest.getRequest().getSession().getAttribute("login_name"));
		}
		System.out.println("--------------------------------------------------------");
	}
}

在xml页面上的使用方式:

<page id="interview" js="/webresources/script/validate.js,/zhaopin/js/sendData.js" interceptor="com.perfect.interceptor.DataSessionIntercetor">
	<tabpanel id="tp1" margin="10px" titlestyle="2">
		<report id="report1" title="面试待邀约信息" parenttitle="待邀约request{c}" rowselect="checkbox" type="editablelist2">
			<interceptor>
				<imports>
					<import>com.wabacus.util.*</import>
					<import>com.java.util.*</import>
				</imports>
				<preaction>
					<![CDATA[
						rrequest.setAttribute("txtgonghao",rrequest.getRequest().getSession().getAttribute("userid"));
					]]>
				</preaction>
			</interceptor>
			<display></display>
			<sql>
				<value>
					<![CDATA[select (SELECT COUNT(*) c FROM A05 a WHERE c10='待邀约') c,c01,c02,c03,c04,c05,c06,c07,c37,c41 from A05 where {#condition#} and c10='待邀约']]>
				</value>
				<condition name="txtgonghao" label="操作人" hidden="true" source="session{userid}">
					<value>
						<![CDATA[c08 = '#data#']]>
					</value>
				</condition>
			</sql>
			<format></format>
		</report>
	</tabpanel>	
</page>

实现session共享的方法有很多,例如:redis、webservie等等,这只是其中的一种,欢迎大家在评论区讨论!


全部评论: 0

    我有话说:

    十堰嘉乐软件基地

    微信 扫一扫

    客户服务热线

    0719-400-10010

    在线客服
    支付宝打赏 微信打赏