本文中介绍我在简单的实际应用中,针对登录用户的访问权限问题的具体实现,整体设计如下图:

图中请求进入Spring容器后会对用户的有效性、权限进行验证,只有验证都通过之后才能进入实际业务逻辑。

上图的实现使用Spring MVC的HandleInterceptor、HandlerInterceptorAdapter实现,下文中将一一介绍到。

HandlerInterceptor接口需要实现类管理请求执行前、执行后、和请求处理完成后所需要执行的动作。代码如下:

public interface HandlerInterceptor {

boolean preHandle(HttpServletRequest var1,HttpServletResponse var2, Object var3) throws Exception;

void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;

void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;

}

preHandle:对HTTP请求进行预处理,返回true则请求继续,返回false则需要对Response进行响应

postHandle:在HTTP请求实际业务逻辑完成后(View渲染之前),处理需要做的动作

afterCompletion:在View渲染完成之后,处理需要的动作

如果操作都需要进行控制,可以直接继承该接口并一一实现其中的方法。但有些时候我们并不需要实现这么多的操作,例如:现在我要对访问的路径进行校验,则我只需要实现preHandle方法就可以满足,这里要用到它的适配器HandlerInterceptorAdapter,代码如下:

public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {

public HandlerInterceptorAdapter() {

}

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

return true;

}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}

public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

}

}

afterConcurrentHandlingStarted:该适配器中还对当前拦截器开始执行后的动作进行了拦截处理,适用于在进行验证之前对HTTP请求做一些统一的处理

接着,我们继承该适配器并重写其中的方法就可以达到我们的目的了,在这里以我的权限检查程序片段为例,代码如下:

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

// 从请求中拿到token

String account = request.getParameter(ACCOUNT_KEY);

String token = request.getParameter(TOKEN_KEY);

// 打印Token和请求地址

LOGGER.info("Account------->{}", account);

LOGGER.info("Token--------->{}", token);

LOGGER.info("ReqUrl-------->{}", request.getRequestURI());

// 任意验证属性为空->重新登录

if (StringUtils.isEmpty(account) || StringUtils.isEmpty(token)) {

response.sendRedirect(request.getContextPath() + "/err/needLogin");

return false;

}

// 验证用户有效性.

boolean flag = validateAccount(request, account, token);

if (!flag) {

// 用户权限验证未通过->重新登录

response.sendRedirect(request.getContextPath() + "/err/needLogin");

return false;

}

// 验证路径权限(AntPathMatcher实现)

boolean authFlag = authPath(request, account);

// 打印验证结果

LOGGER.info("UserAuth----->{}", flag);

LOGGER.info("PathAuth----->{}", authFlag);

if (flag && authFlag) {

return true;

} else {

// 未通过路径权限验证,跳转到错误URL

response.sendRedirect(request.getContextPath() + "/err/notAllow");

}

return false;

}

这里根据我的验证逻辑我只实现了preHandle方法,其中使用AntPathMatcher实现路径匹配的实现会在下一篇中详细介绍。实现类完成后需要配置生效,那么在spring的配置文件中,我们可以这么写,代码如下:

不要忘了引入Spring Schema:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

这样我们就通过Spring的拦截器实现了URL访问权限校验。

java url拦截器框架_使用Spring Interceptor实现URL访问校验相关推荐

  1. java面试 拦截器问题_面试必问:给我说一下Spring MVC拦截器的原理?

    拦截器是每个Web框架必备的功能,也是个老生常谈的主题了.本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原理. 重要接口及类介绍1. HandlerExecutionCh ...

  2. java中的 请求体_在spring mvc test中访问请求体和请求头

    我创建了一个spring boot应用程序,这就是我的控制器的样子 . 我使用postman在请求体中发送json,在请求头中发送一个字符串,然后进一步散列json并将其与请求头获取的字符串进行比较 ...

  3. 用 Java 实现拦截器 Interceptor 的拦截功能

    Java 里的拦截器是动态拦截 action 调用的对象,它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行,同时也提供了一种 ...

  4. Java EE拦截器

    历史 我认为重要的是要看一下Java EE中的Interceptor的发展,因为它是从EJB特定的项目开始的,后来又演变成一个单独的规范,现在可供其他Java EE规范扩展,这一事实很简单. 版本1. ...

  5. springboot 拦截器 日志_跟武哥一起学习Spring Boot,一份全面详细的学习教程

    SpringBoot现在已经是企业开发项目的标准框架,至少新项目一般都会使用SpringBoot框架,发现有一个SpringBoot的笔记写的非常好,非常全面, 也非常认真,即使你对SpringBoo ...

  6. java struts 拦截器_java框架篇---struts实现拦截器

    Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept ...

  7. java登陆拦截器_登陆拦截器LoginInterceptor

    [java]代码库package com.liang.bike.interceptor; import com.liang.bike.bean.base.UserBase; import org.ap ...

  8. [JAVA EE] 拦截器

    拦截器 ◼ 拦截器(Interceptor)主要用于拦截用户请求并作相应的处理. ◼ 基于Java的反射机制,属于面向切面编程(AOP)的一种运用. ◼ 应用场景:验证用户登录状态.权限验证.记录系统 ...

  9. java 搭建企业应用框架_溯源微服务开发体系:一位Java开发者的转型思考

    作者丨赵钰莹 简单来说,微服务是将大型单体应用程序和服务拆分为数个甚至数十个微服务,可扩展单个组件而不是整个应用程序堆栈,从而满足服务等级协议.然而,这个过程涉及很多问题需要解决,比如拆分原则.容量规 ...

最新文章

  1. Python监控目录和文件变化
  2. ResourceLoader
  3. PowerDesigner中NAME和COMMENT的互相转换,需要执行语句
  4. Linux的scan命令,linux的scan命令
  5. From NSURLConnection to NSURLSession
  6. 跨平台移动应用开发框架AppCan2.0开发经验分享
  7. 一个简单的EXCEL 导入SQL 的例子
  8. html2cavans
  9. html5读delphi数据,Delphi HTML解析器
  10. MATLAB矩阵转置
  11. Quartz cron表达式(时间表达式)
  12. 需求分析——系统建模方法
  13. python 列表、元组、字典、集合
  14. 英语不好、数学不好能自学编程吗?自学编程出路如何?老程告诉你
  15. php theexcerpt,WordPress获取文章摘要函数the_excerpt、get_the_excerpt
  16. 斯坦福ML课程——python转写(Week7—课程作业ex6_2)
  17. TCP滑动窗口原理终于清楚了!
  18. 探店视频批量剪辑神器,批量生成音画同步探店视频,好物视频和团购达人视频
  19. c语言用指针升序降序,C语言函数序——升序降序.doc
  20. 图森计划裁员25%/ 特斯拉被曝将冻结招聘/ 天才黑客Geohot从推特辞职…今日更多新鲜事在此...

热门文章

  1. eclipse中自定义videoview类_android控件之VideoView建立自己的播放器
  2. gui python qt 绘图_最全整理!计算、可视化、机器学习等8大领域38个常用Python库...
  3. oracle匿名代码块执行insert,MyBatis+Oracle在执行insert时空值报错之从源码寻找解决办法...
  4. java重_重拾JAVA,重识JAVA(一)
  5. vue 日期格式化返回指定个数月份_python时间与日期处理一次看个够(time、datetime、calendar)...
  6. 服务器维保价格标准_汽车后市场大数据研究报告:《汽车后市场乘用车维保行业白皮书》...
  7. u盘pe无人值守linux,从U盘无人值守安装linux操作系统(纯实践笔记
  8. oracle 10g crs_stop -all 命令后遇到 UNKNOWN
  9. activity和fragment生命周期
  10. oracle11 rman全备,Oracle 11g非归档模式下mount状态RMAN究竟能不能进行全备?