文档章节

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

莫库什勒
 莫库什勒
发布于 2017/01/10 21:41
字数 953
阅读 65
收藏 2

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

 

最后返回结果:

 

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

  • 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接口路径

 

 

© 著作权归作者所有

莫库什勒

莫库什勒

粉丝 21
博文 177
码字总数 70016
作品 0
杭州
高级程序员
私信 提问
spring boot(五)spring security

Spring security 1.认证Authentication,确认用户可以访问当前系统 重写protect void configure(AuthenticationManagerBuilder auth){ 1. auth.inMemoryAuthentication() .withUser(“ss”)......

sun_tantan
2018/07/02
0
0
SSM框架整合Shiro后的开发

手摸手教你SSM框架整合Shiro后的开发 前面,我们学习了Shiro实现权限管理之表结构设计以及JQuery-Ztree.js使用范例 ,接下来就详细介绍一下SSM框架整合Shiro框架后的开发。同样推荐大家参看张...

TyCoding
2018/09/19
273
0
Spring 和 Django 安全机制的比较

做了一年多的python 方面的web开发工作,昨个有个同学问我Django的安全机制,我是一脸的茫然。每天使用公司开发框架的我,对这些东西了解的甚少,俨然成为一个真正的"码农",只知其然而不知其...

北方攻城师
2014/10/13
300
0
Acegi框架介绍

概述 对于任何一个完整的应用系 统,完善的认证和授权机制是必不可少的。Acegi Security(以下简称Acegi)是一个能为基于Spring的企业应用提供强大而灵活安全访问控制解决方案的框架,Acegi...

红薯
2010/05/07
11.8K
5
spring security 3中关于ajax的处理

在spring security 3中,对于某些需要保护的url,可以很容易地实现当没权限的时候, redirect到一个页面(比如自定义的404.jsp页面)进行显示没权限的信息; 但有的时候,必须要对一些AJAX的...

jackyrong
2013/01/16
249
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部