java权限拦截,控制当前登录用户访问方法,访问路径,并json提示,驳回请求

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

常用到的springMVC权限拦截器,以前没做过记录,今天在这里重温一下记录配置;

原理:   

 浏览器发起请求(开始)   >>

    进入到拦截方法A >> 进入到Controller某个方法内,且执行代码  >>

    进入拦截器方法B >> Controller return 代码执行 >>

    进入到拦截器方法C >>

浏览器页面响应(结束) 

 

拦截器: 默认存在三个方法(需继承HandlerInterceptorAdapter类)

  • 方法A: 所有请求之前  preHandle() 
  • 方法B: Controller return 之前 postHandle()
  • 方法C: Controller retrrn 之后 afterCompletion()
public class LoginLogInterceptor extends HandlerInterceptorAdapter{
	
	Logger logger = Logger.getLogger(this.getClass());
	
	// 必须要管理员才开操作的api权限 管理员权限,最大
	private static final String [] SYSTEMP_URI={"/web/channel/updChannel","/web/channel/delChannel",
		"/web/userAccoutNo/addPartner","/web/userAccoutNo/getPageByManager"};
	// 次管理权限
	private static final String [] PARTNER_URI={"/web/userAccoutNo/getPageByPartner"};
	
	
	
	/**  
	 *   最先执行 :  在业务处理器处理请求之前被调用  
	 * 如果返回false  
	 *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 
	 * 如果返回true  
	 *    执行下一个拦截器,直到所有的拦截器都执行完毕  
	 *    再执行被拦截的Controller  
	 *    然后进入拦截器链,  
	 *    从最后一个拦截器往回执行所有的postHandle()  
	 *    接着再从最后一个拦截器往回执行所有的afterCompletion()  
	 */  
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		String ip = RequestParam.getRealAddress(request);//ip
		LoginTicket lt = StaticResouse.getUserSession(request);
		logger.info("A 拦截日志......."+lt);
		
		if(lt==null){
			ResponseObj obj = new ResponseObj();
			obj.setStatus(0);
			obj.setShowMessage("请先登录");
			response.setHeader("Content-type", "application/json;charset=UTF-8");  
			response.getWriter().write(obj.getJsonStr());
			return false;
		}
		
		// 判断操作权限
		String currUrl =  request.getServletPath();
		
		if (Arrays.binarySearch(SYSTEMP_URI, currUrl)>=0){
			// 管理员 小于 10 权限则提示
			if(UserLevel.SYSTEM.getCode()>Integer.parseInt(lt.getLevel())){
				ResponseObj obj = new ResponseObj();
				obj.setStatus(0);
				obj.setShowMessage("权限不足");
				response.setHeader("Content-type", "application/json;charset=UTF-8");  
				response.getWriter().write(obj.getJsonStr());
				return false;
			}
		}
		
		if(Arrays.binarySearch(PARTNER_URI, currUrl)>=0){
			// 小于 8 权限则提示
			if(UserLevel.PARTNER.getCode()>Integer.parseInt(lt.getLevel())){
				ResponseObj obj = new ResponseObj();
				obj.setStatus(0);
				obj.setShowMessage("权限不足");
				response.setHeader("Content-type", "application/json;charset=UTF-8");  
				response.getWriter().write(obj.getJsonStr());
				return false;
			}
		}
		
		return true;
	}
	
	/** 
     * 第二步:  在业务处理器处理请求执行完成后,生成视图之前执行的动作    
     * 可在modelAndView中加入数据,比如当前时间 
     */
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		logger.info("B拦截日志.......");
	}
	
	
	/**  
     * 第三步:  在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
     *   
     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
     */
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		logger.info("C拦截日志.......");
		super.afterCompletion(request, response, handler, ex);
	}

}

 

Controller: 控制转发器

  • 存在多个方法,如addMethod,delMothod,getMethod等等, 我们做的是api接口,统一采用返回string方式返回
@RequestMapping(value="/getDetailByChannel",produces="text/html;charset=UTF-8")
   @ResponseBody
   public String  getDetailByChannel(HttpServletRequest request,
HttpServletResponse response,Long chid){
	   ResponseObj obj = new ResponseObj();
	   if(chid==null){
		  obj.setShowMessage("请传入id参数");
		  return obj.getJsonStr();
	   }
	   
	   ChannelInfoModel tempModel =  channelService.getDetailByChannel(chid);
	   obj.setData(tempModel);
	   
	   return obj.getJsonStr();
	}

 

XML配置


    
    	 
		
			
			
			
       		
			
		
		 
	   
	   
	   
	      
	        
	     
	   
   

 

最后返回结果:

java权限拦截,控制当前登录用户访问方法,访问路径,并json提示,驳回请求_第1张图片

 

好了,结束完毕,注意以上几个技术节点

  • Arrays.binarySearch(SYSTEMP_URI, currUrl)>=0 : 判断某个字符是否存在字符数组内
  • UserLevel.SYSTEM.getCode() 枚举式显示用户等级
  • response.setHeader("Content-type", "application/json;charset=UTF-8");  
    response.getWriter().write(obj.getJsonStr());   response输出结果值页面
  • request.getServletPath() 获取当前请求路径, 不包含项目名,仅API接口路径

 

 

转载于:https://my.oschina.net/java1314/blog/822482

你可能感兴趣的:(java权限拦截,控制当前登录用户访问方法,访问路径,并json提示,驳回请求)