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

常用到的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配置

<!--配置拦截器, 多个拦截器,顺序执行 -->
    <mvc:interceptors>
    	<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller --> 
		<mvc:interceptor>
			<mvc:mapping path="/" />
			<mvc:mapping path="/web/**"/>
			<!-- 配置不需要过滤的访问地址,此路径将不会经过拦截器 -->
       		<mvc:exclude-mapping path="/web/user/doLogin"/>
			<bean id="loginLogInterceptor" class="com.XXX.jar.base.interceptor.LoginLogInterceptor"  />
		</mvc:interceptor>
		 
	   
	   <!-- app接口异常拦截 ,返回异常状态-->
	   <mvc:interceptor>
	      <mvc:mapping path="/app/**" />
	      <bean class="com.XXX.jar.base.interceptor.ExceptionInterceptor"></bean>  
	   </mvc:interceptor>  
	   
   </mvc:interceptors>

 

最后返回结果:

214059_XGmV_1995134.png

 

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

  • 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值