1 .拦截器(Interceptor):

用于在某个方法被访问之前进行拦截,然后在Handler执行之前或之后加入某些操作,其实就是AOP的一种实现策略。 拦截用户的请求并进行相应的处理,比如:判断用户是否登陆,判断用户权限,是否在可购买时间内,记录日志信息等。。

创建拦截器:实现HandlerInterceptor

@Component
public class TestInterceptor implements HandlerInterceptor { //请求在进入Handler之前,该方法会被调用
//如果返回true,则表示该请求会继续往下执行,也就是才会执行到Handler
//如果返回false,就不会执行到Handler,并且另外两个方法也不会执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//因为我们使用的是注解形式的处理器(RequestMapping)
//所以handler对象的真正的类型是HandlerMethod
HandlerMethod hm = (HandlerMethod) handler;
//获取该方法的注解对象
// hm.getMethodAnnotation();
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if (user != null){ return true; //放行
}
response.sendRedirect("/log"); //重定向
return false;
} /*
Handler中的方法执行完毕之后,向客户端返回视图之前执行.
方法参数中的ModelAndView对象就是给客户端渲染所用的对象. */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { }
/*
这个请求已经给客户端完成了渲染的工作之后,该方法会执行
这个方法中一般会做资源的清理工作.
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
}

创建好一个拦截器,需要在spring配置文件中配置拦截器属性:

   <mvc:interceptors>
<mvc:interceptor>
<!--/**表示所有请求地址都要经过拦截器-->
<mvc:mapping path="/**"/>
<!--下面表示这些地址可以不走拦截器-->
<mvc:exclude-mapping path="/log"/>
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/relog"/>
<mvc:exclude-mapping path="/home"/>
<!--在拦截器类上加了注解@Component,所以可以直接引入拦截器id,表明上面被拦截的地址需要经过哪个拦截器-->
<ref bean="testInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

自定义注解,配合拦截器完成一些功能:

2. 自定义注解:

新建一个类,将class属性改为@interface ,这个类就变成一个自定义注解了

/*
注解上面需要配置这个注解可以用到哪里:
例如:是给类用的,还是给属性用的,还是给方法用的
*/
@Target(ElementType.METHOD)
//这个注解是在运行时候生效的
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckPermission {
String value();
}

在需要获取请求参数的处理器头部添加该自定义注解,

@Controller
public class UserController { @CheckPermission("one")
@RequestMapping("/one")
public String one(){ return "one";
} @CheckPermission("two")
@RequestMapping("/two")
public String two(){ return "two";
} @CheckPermission("three")
@RequestMapping("/three")
public String three(){ return "three";
} @CheckPermission("four")
@RequestMapping("/four")
public String four(){ return "four";
}
}

通过获取这个注解的参数,配合拦截器可以做一个权限的功能;

package com.lanou.demo.interceptor;

import com.lanou.demo.annotation.CheckPermission;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List; @Component
public class TestInterceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession();
List<String> list = (List<String>) session.getAttribute("arr");
//获取Handler信息
HandlerMethod mv = (HandlerMethod) handler;
//判断这个请求方法是否有这个注解
if (mv.hasMethodAnnotation(CheckPermission.class)) {
//通过这个注解获取到请求地址
CheckPermission annotation = mv.getMethodAnnotation(CheckPermission.class);
String value = annotation.value(); if (list != null){
//判断这个地址是否有权限
if (list.contains(value)) {
//有权限,放行
return true;
}
}
}
//没有权限,重定向到某个页面
response.sendRedirect("/log");
return false;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
}

拦截器和自定义注解@interface的更多相关文章

  1. [Java]利用拦截器和自定义注解做登录以及权限验证

    1.自定义注解 需要验证登录的注解 package com.etaofinance.wap.common; import java.lang.annotation.Documented; import ...

  2. Spring MVC基础知识整理➣拦截器和自定义注解

    概述 Spring MVC中通过注解来对方法或者类进行动态的说明或者标注,类似于配置标识文件的属性信息.当标注的类或者方式被使用时候,通过提取注解信息来达到对类的动态处理.在 MVC中,我们常用的注解 ...

  3. struts2拦截器加自定义注解实现权限控制

    https://blog.csdn.net/paul342/article/details/51436565 今天结合Java的Annotation和Struts2进行注解拦截器权限控制. 功能需求: ...

  4. SpringMVC拦截器+Spring自定义注解实现权限验证

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  5. SpringBoot 拦截器和自定义注解判断请求是否合法

    应用场景举例: 当不同身份的用户请求一个接口时,用来校验用户某些身份,这样可以对单个字段数据进行精确权限控制,具体看代码注释 自定义注解 /** * 对比请求的用户身份是否符合 * @author l ...

  6. 使用struts2中默认的拦截器以及自定义拦截器

    转自:http://blog.sina.com.cn/s/blog_82f01d350101echs.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Acti ...

  7. CXF添加拦截器和自定义拦截器

    前面讲了如何采用CXF开发webservice,现在来讲如何添加拦截器和自定义拦截器. 服务端代码: HelloWorld implementor=new HelloWorldImpl(); Stri ...

  8. Struct2_定义拦截器并使用注解方式作用在Action的方法中

    一.目的:通过在方法上加注解控制哪些方法需要登陆后才能访问   二.方式:利用拦截器判断用户是否登陆   三.实现步骤 定义配置文件struts.xml添加节点 1 2 3 4 5 6 7 8 9 1 ...

  9. 从struts2拦截器到自定义拦截器

    拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.xml的配置中,package内直接或间接继承了struts-default.xml,这样st ...

随机推荐

  1. JVM内核-原理、诊断与优化学习笔记(九):锁

    文章目录 线程安全 多线程网站统计访问人数 多线程访问ArrayList 对象头Mark Mark Word,对象头的标记,32位 描述对象的hash.锁信息,垃圾回收标记,年龄 偏向锁 轻量级锁 B ...

  2. IntelliJ IDEA(的springboot项目)环境准备(配置maven和jdk)

    1.配置maven .使用自己电脑上装的maven版本,而非默认的.(方法一) (1)选择configure--Settings (2)搜索maven,配置3.6.2版本的maven.注意:将mave ...

  3. HDU 2586 /// tarjan离线求树上两点的LCA

    题目大意: 询问一棵树里 u 到 v 的距离 可由 dis[ u到根 ] + dis[ v到根 ] - 2*dis[ lca(u,v) ] 得到 https://blog.csdn.net/csyzc ...

  4. Japan 2005 Domestic Cleaning Robot /// BFS 状压 二进制位运算 结构体内构造函数 oj22912

    题目大意: 输入w h,接下来输入h行w列的图 ' . ':干净的点:  ' * ' :垃圾:  ' x ' : 墙:  ' o ' : 初始位置: 输出 清理掉所有垃圾的最短路径长度 无则输出-1 ...

  5. Linux-iptables-route-rule

    详情: http://www.mamicode.com/info-detail-1412618.html  最后面有粘贴 linux系统路由表 linux一共0-255个路由表 linux可以自定义从 ...

  6. log4j2 按日期分割,自动清理历史文件

    方式一:定义CronTriggeringPolicy <?xml version="1.0" encoding="UTF-8"?> <Conf ...

  7. 关于FR4板一些重复的数据

    介电常数:4.2-4.7 信号传输速度:表层 140~170 ps/inch, 内层 180 ps/inch

  8. 【JZOJ3422】水叮当的舞步

    description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ 地毯上 ...

  9. CSS——背景渐变

    在线性渐变过程中,颜色沿着一条直线过渡:从左侧到右侧.从右侧到左侧.从顶部到底部.从底部到顶部或着沿任何任意轴.如果你曾使用过制作图件,比如说Photoshop,你对线性渐变并不会陌生. 兼容性问题很 ...

  10. [NOI2007]生成树计数环形版

    NOI2007这道题人类进化更完全之后出现了新的做法 毕姥爷题解: 于是毕姥爷出了一道环形版的这题(test0814),让我们写这个做法 环形的情况下,k=5的时候是162阶递推. 求这个递推可以用B ...