⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 websecurityfilter.java

📁 EOS的一个很好的例子.包括页面构件、展现构件
💻 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 + -