package com.rbac.common;
import java.io.IOException;
import java.util.Set;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.RequestProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.rbac.util.CommonUtils;
public class MvcRequestProcessor extends RequestProcessor{
private ApplicationContext getCtx(HttpServletRequest request) {
ApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(request.getSession()
.getServletContext());
return ctx;
}
/**
* struts控制器,用于权限验证
*/
public boolean processRoles(HttpServletRequest request,
HttpServletResponse response, ActionMapping mapping)
throws IOException, ServletException {
HttpSession session = request.getSession();
// 如果访问的路径是登陆、登出则不需要权限验证
if (mapping.getPath().equals("/login")
|| mapping.getPath().equals("/logout")) {
return true;
}
// 如果没有登录,进行提示并返回到错误页面
if (session.getAttribute(MvcConstant.USER) == null) {
request.setAttribute(MvcConstant.ERROR_MSG, "请先登录系统");
RequestDispatcher rd = request.getRequestDispatcher("/login.jsp");
rd.forward(request, response);
return false;
}
//检查登录用户是否有权限访问该路径
UserDetail user = (UserDetail)session.getAttribute(MvcConstant.USER);
Set<String> permitActionSet = user.getPermitActionSet();
if(CommonUtils.isBlank(mapping.getPath()) || !permitActionSet.contains(mapping.getPath().substring(1)+".do")){
request.setAttribute(MvcConstant.ERROR_MSG, "你没有权限访问该功能");
RequestDispatcher rd = request.getRequestDispatcher("/login.jsp");
rd.forward(request, response);
return false;
}
return true;
}
}