SpringBoot拦截器

package com.artemis.router.interceptor;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.artemis.router.entity.ArUser;
import com.artemis.router.util.StaticValues;
import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion.User;

/**
 * 拦截未登录用户请求
 * 
 * @Title UserInterceptor.java 
 * @description TODO 
 * @time 2017年10月11日 上午9:33:34 
 * @author LILJ 
 * @version 1.0
 */
public class UserInterceptor extends HandlerInterceptorAdapter {
	
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		String requestPath = request.getServletPath();
		//开放根目录
		if ("/".equals(requestPath)){
			if(request.getSession().getAttribute(StaticValues.USERSESSIONKEY) == null){
				return true;
			}else{
				response.sendRedirect("/page/index");
				return false;
			}
			
		}
		//开放登录
		if ("/login".equals(requestPath)){
			return true;
		}
		
		//开放对外服务接口
		if (requestPath != null && requestPath.startsWith("/service")){
			return true;
		}
		
		Object userObj = request.getSession().getAttribute(StaticValues.USERSESSIONKEY);
		if(userObj == null){
			response.sendRedirect("/");
			return false;
		}
		if ("/page/index".equals(requestPath)){
			return true;
		}
		if ("/user/logout".equals(requestPath)){
			return true;
		}

		//权限拦截
		Object authObj = request.getSession().getAttribute(StaticValues.USER_AUTH);
		if(authObj != null){
			int auth = Integer.parseInt(authObj.toString());
			ArUser user = (ArUser) userObj;
			Long roleId = user.getRoleId();
			if(roleId != 1){//admin 不用鉴权
				boolean b = checkEditAndExportRole(auth, requestPath);
				if(!b){
					return b;
				}
			}
		}
		
		Object urlistObj = request.getSession().getAttribute(StaticValues.ROLE_MENU_URL);
		if(urlistObj == null){
			response.setStatus(403);
			return false;
		}
		
		List<String> urlist = (List) urlistObj;
		int index = requestPath.indexOf("?");
		if(index != -1){
			requestPath = requestPath.substring(0,index);
		}
		if(urlist.contains(requestPath)){
			return true;
		}else{
			String fromUrl = request.getHeader("Referer");
			if(fromUrl == null){
				return false;
			}
			fromUrl = fromUrl.replace("https://", "").replace("http://", "");
			index = fromUrl.indexOf("/");
			fromUrl = fromUrl.substring(index);
			index = fromUrl.indexOf("?");
			if(index != -1){
				fromUrl = fromUrl.substring(0,index);
			}
			if(urlist.contains(fromUrl)){
				urlist.add(requestPath);
				return true;
			}
			return false;
		}
	}
	//检查权限
	private boolean checkEditAndExportRole(int auth, String requestPath){
		if(auth == 11){
			return true;
		}
		if(requestPath.indexOf("/exportask") > -1){
			//导出
			if(auth != 1){
				return false;
			}
		} else if(requestPath.indexOf("/edit") > -1 || requestPath.indexOf("/insert") > -1 || requestPath.indexOf("/update") > -1 || requestPath.indexOf("/del") > -1){
			//编辑
			if(auth != 10){
				return false;
			}
		}
		return true;
	}
	
}

我做的是权限拦截部分。
auth为权限,第一位为编辑,第二位为导出,0代表没有权限,1代表导出,10代表编辑权限,11代表既有导出也有编辑权限。
通过统计,"/edit","/insert",“/update”,"/del"为编辑权限的url中包含的关键字,"/exportask/edit"又为导出的关键字,所以先判断导出。
上权限拦截中,先判断权限对象是否为空,若不为空,转权限对象为int,user对象转user,获取roleId,roleId为1时即是超级管理员,拥有最高权限,无需拦截,否则,则根据检查权限所获取的值进行拦截。

你可能感兴趣的:(后端)