公共用户自动登录导致的session冲突
1 概述
业务场景:
某公司在在微信公众平台上集成的时候会出现session冲突的问题。情况是这样,在平台上集成了我们smartbi里做的两块功能,微招聘与投诉。
微招聘
:使用公共的用户自动登录到我们smartbi:使用公共的用户(可以理解为系统内置匿名用户)自动登录到我们smartbi
投诉 :需要用户登录后才能打开该页面
两个功能独立运行正常。 两个功能独立运行正常。
产生的问题: 当我打开了微招聘,会
当我打开了微招聘,会使用默认用户(chakanjob)自动登录。 锚
在不关闭微信的情况下,再去打开投诉页面,会保留chakanjob用户的session,导致无法打开(因chkanjob用户没有看投诉页面的权限)
在不关闭微信的情况下,再去打开投诉页面,会保留chakanjob用户的session,导致无法打开(因chkanjob用户没有看投诉页面的权限)。
解决的思路:
编写一个filter,拦截openresource.jspjsp,当没有传递用户名密码时,如果判断到用户没有资源权限,直接重定向到登陆界面。从而让微信中同时支持匿名用户登陆资源和需要用户登陆的资源。 当没有传递用户名密码时
如果判断到用户没有资源权限,直接重定向到登陆界面。
2 详细步骤
2.1 在extension.xml声明过滤器:
代码块 | ||
---|---|---|
| ||
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE extension SYSTEM "extension.dtd"> <extension name="Test" alias="Test" desc="Test" priority="100" version="1.0"> <enable-jsp-processor>1</enable-jsp- |
...
processor>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>djjt.rfc.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/vision/openresource.jsp</url-pattern>
</filter-mapping>
</extension> |
2.2 编写filter
代码块 | ||
---|---|---|
| ||
package djjt.rfc;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import smartbi.catalogtree.CatalogTreeModule;
import smartbi.usermanager.UserManagerModule;
import smartbi.util.StringUtil;
public class LoginFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String resId = request.getParameter("resid");
String user = request.getParameter("user");
UserManagerModule userManagerModule = UserManagerModule.getInstance();
//传递了用户名密码的不作处理,依然会默认提示无权限,
//只处理已经登陆但是没有权限的退出登陆
if (!StringUtil.isNullOrEmpty(resId) && StringUtil.isNullOrEmpty(user)
&& userManagerModule.isLogged()) {
boolean isCatalogElementAccessible = CatalogTreeModule.getInstance()
.isCatalogElementAccessible(resId, "REF");
if (!isCatalogElementAccessible) {
userManagerModule.logout();
}
}
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig config) throws ServletException {
}
}
|