2019独角兽企业重金招聘Python工程师标准>>>
常用到的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配置
最后返回结果:
好了,结束完毕,注意以上几个技术节点
- 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接口路径