📄 websecurityfilter.java
字号:
package com.primeton.eos.fbframe.fbrole.security.filter;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import com.primeton.eos.fbframe.config.*;
import com.primeton.eos.fbframe.fbrole.security.impl.*;
import com.primeton.eos.fbframe.fbrole.security.impl.SecurityManager;
import com.primeton.tp.core.license.EOSLicenseRuntimeException;
import com.primeton.tp.core.prservice.context.SessionContext;
import com.primeton.tp.core.prservice.monitor.CurrentUserMBean;
import com.primeton.tp.core.prservice.monitor.UserMessage;
import com.primeton.tp.core.management.StatQueue;
import com.primeton.tp.core.management.users.EOSUserManager;
import com.primeton.tp.core.management.IPController;
import com.primeton.tp.core.config.EOSAppConfiguration;
public class WebSecurityFilter implements Filter {
private String noPermission = null;
private String postfix = null;
private String portalMode = null;
//不属于EOS管辖的资源
private static final int EOS_NOT_INVOLVED = 0;
//直接调用"展现逻辑"的情况
private static final int EOS_PRLOGIC = 1;
//通过forward调用jsp的情况
private static final int EOS_FORWARD_JSP = 13;
//通过forward调用的jsp调用业务逻辑的情况
private static final int EOS_FORWARD_BIZ = 12;
//直接调用“业务逻辑”的情况
private static final int EOS_BIZLOGIC = 2;
//直接调用jsp 的情况
private static final int EOS_JSPLOGIC = 3;
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("##### 开源组织权限管理系统 Filter 初始化 #####");
String webxml = filterConfig.getServletContext().getRealPath("/WEB-INF/web.xml");
if( webxml == null ){
System.out.println("/**********************************************");
System.out.println("/*");
System.out.println("/* 没有发现web.xml文件");
System.out.println("/*");
System.out.println("/**********************************************");
}
//初始化fbframe的配置信息
FbFrameConfig.getInstance().init(webxml);
//指定的 没有权限时 显示的页面
noPermission = FbFrameConfig.getInstance().getNoPermissionPage();
postfix = FbFrameConfig.getInstance().getPrActionPostfix();
portalMode = FbFrameConfig.getInstance().getPortalMode();
//初始化全局资源列表
GlobalCheckedBizsManager.getInstance();
GlobalCheckedJspsManager.getInstance();
GlobalCheckedPrsManager.getInstance();
}
/*
* 验证请求资源的权限 。
*/
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest rq = (HttpServletRequest)request;
HttpSession session = rq.getSession();
try{
registerUser(rq);
String actionName = rq.getServletPath();
//portal 情况
if( portalMode.equalsIgnoreCase("false")){
SessionContext sessionContext = (SessionContext)session.getAttribute(SessionContext.SESSION_SESSION_CONTEXT);
if( sessionContext != null){
if( actionName.endsWith(".login"+postfix)){
//用户在没有注销时候进行重新登陆时让session失效后执行登录程序
rq.getSession().invalidate();
rq.getRequestDispatcher(actionName).forward(request, response);
return;
}
//根据HTTPRequest生成EOSRequest这种请求的EOS资源对象
EOSRequest er = EOSRequest.buildEOSRequest(rq);
//验证资源的权限
boolean checkResult = SecurityManager.doAuth(er);
//页面的走向
if( checkResult == true ){
chain.doFilter(request, response);
}else{
//没有执行权限的情况
String feedback = SecurityManager.nextPage(er);
rq.getRequestDispatcher(feedback).forward(request, response);
}
} else {
EOSRequest er = EOSRequest.buildEOSRequest(rq);
// 如果没有session不存在,如是直接调用JSP检查jsp是否需要验证权限,如果需要验证转到welcome页面
if (er.getEOSRequestType() == EOSRequest.EOS_JSPLOGIC) {
if( GlobalCheckedJspsManager.getInstance().contains(er.getEOSResourceName())) {
rq.getRequestDispatcher(FbFrameConfig.getInstance().getWelcomeFile()).forward(request, response);
return;
}
}
// 如果session不存在,检查请求是否调用业务逻辑,如果是转到welcome页面
if (er.getEOSRequestType() == EOSRequest.EOS_BIZLOGIC || er.getEOSRequestType() == EOSRequest.EOS_FORWARD_BIZ) {
rq.getRequestDispatcher(FbFrameConfig.getInstance().getWelcomeFile()).forward(request, response);
return;
}
chain.doFilter(request, response);
}
} else {
chain.doFilter(request, response);
}
}catch(Exception e){
e.printStackTrace();
}
}
/*
* 限制同一个账号从不同的IP登陆系统 。
*/
private boolean loginable(HttpServletRequest rq){
/*
List currentUsers = CurrentUserMBean.getUserMBean().currentUsers();
Iterator iterator = currentUsers.iterator();
while( iterator.hasNext() ){
UserMessage u = (UserMessage)iterator.next();
}
*/
return true;
}
/*
* 注册当前登陆的用户信息 。
*/
private void registerUser(HttpServletRequest rq){
HttpSession session = rq.getSession();
SessionContext sessionContext = (SessionContext)session.getAttribute(SessionContext.SESSION_SESSION_CONTEXT);
// session 为空时候不注册用户
if (sessionContext == null)
return;
// 检查当前session中的用户是否注册到用户列表中
String isRegister = (String)session.getAttribute("FILTER_EOS_USER_REGISTED");
if (isRegister != null)
return;
String sessionID = session.getId();
String userID = sessionContext.getUserID();
if (userID == null || "".equals(userID))
return;
String userRemoteAddr = rq.getRemoteHost();
try{
IPController.addIPAddr(userRemoteAddr);
}catch(EOSLicenseRuntimeException ere){
System.out.println("/**********************************************");
System.out.println("/*");
System.out.println("/* " + ere.getMessage());
System.out.println("/*");
System.out.println("/**********************************************");
}
long curTime = System.currentTimeMillis();
UserMessage userMsg = new UserMessage(CurrentUserMBean.getUserMBean(EOSAppConfiguration.getDefaultAppID()), userID, userRemoteAddr, sessionID, curTime);
userMsg.setRegister(true);
StatQueue.theOne().put(userMsg);
EOSUserManager.addUser(EOSAppConfiguration.getDefaultAppID(), userID, sessionID, userRemoteAddr, curTime);
// 设置当前session用户已经注册到用户列表中
session.setAttribute("FILTER_EOS_USER_REGISTED", "true");
}
public void destroy() {
this.noPermission = null;
this.postfix = null;
this.portalMode = null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -