拦截器和自定义注解@interface

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 {

    }
}

原文地址:https://www.cnblogs.com/zhouchangyang/p/10908343.html

时间: 2024-10-07 16:04:43

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

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

设计思路 主要针对需要登录后操作的接口进行校验.接入层在对外暴露接口后,网页.APP.第三方等等途径进行访问接口.用户请求首先会被SpringMVC拦截器拦截到,在拦截器里第一步就是需要校验用户的登录身份(由于是分布式系统这里采用的是userId+accessToken方式来校验),登录校验通过之后再进行用户权限校验,此时会自动拦截@AuthValidate注解的method(核心),如果权限校验失败则抛出权限不足异常,否则校验通过之后再执行具体接口并返回结果. 1.自定义注解 1 packag

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

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

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

https://blog.csdn.net/paul342/article/details/51436565 今天结合Java的Annotation和Struts2进行注解拦截器权限控制. 功能需求:添加.查找.删除三个功能,添加.查找功能需进行权限拦截判断,删除功能则不需进行权限拦截判断. 操作流程如下:客户未登录或登录已超时,提示"客户还没登陆或登陆已超时!!!",终止执行,然后跳转到某页面:否则继续往下执行. 以下模拟案例大概实现如上需求,接下来废话少说,直接copy代码 项目地

WebServices中使用cxf开发日志拦截器以及自定义拦截器

首先下载一个cxf实例,里面包含cxf的jar包.我下的是apache-cxf-2.5.9 1.为什么要设置拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 2.拦截器分类 1. 按所处的位置分:服务器端拦截器,客户端拦截器 2. 按消息的方向分:入拦截器,出拦截器 3. 按定义者分:系统拦截器,自定义拦截器 3.拦截器API Interceptor(拦截器接口) AbstractPhaseInterceptor(自定义拦截器从此继承) Loggi

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

一.目的:通过在方法上加注解控制哪些方法需要登陆后才能访问 二.方式:利用拦截器判断用户是否登陆   三.实现步骤 定义配置文件struts.xml添加节点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <package name="custom-default" extends="struts-default">         <interceptors>             &

struts2内置拦截器和自定义拦截器详解(附源码)

一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截器,拦截器才可以正常的工作和运行.Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现.大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与 拦截器链的配置.内置拦截器虽然在struts2中都定义了,但是并不是都起作用的.因为并不是所有拦截器都被加

重写拦截器和自定义拦截器

1):重写拦截器的方式 重写拦截比较简单首先确定重写的拦截器: 例如:DefaultWorkflowInterceptor拦截器 I:找到DefaultWorkflowInterceptor的源代码 复制源代码 II:在自己创建的工程里加入DefaultWorkflowInterceptor的整个包的路径 com.opensymphony.xwork2.interceptor 创建一个类DefaultWorkflowInterceptor张贴复制DefaultWorkflowIntercepto

【WebService】CXF拦截器的设置以及自定义CXF拦截器

WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义WebService服务及其调用 [WebService]wsdl配置详解以及使用注解修改wsdl配置 [WebService]CXF处理javaBean等复合类型以及Map等复杂类型的数据 CXF的拦截器和以前学过的servlet的拦截器类似的,都是在开始或结束切入一段代码,执行一些逻辑之类的.我们可以在调用ws服务前设置拦截器,也可以在调用ws服务后设置拦截器,当然了,拦

struts2学习笔记---自定义拦截器

什么是拦截器? struts2中拦截器分为Struts2定义好的拦截器和自定义的拦截器.其作用是在一个Action执行之前进行拦截,在Action执行之后又加入某些操作. 实现原理 当请求一个Action时,struts2会查找配置文件,并根据这个Action的配置实例化对应的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器. 拦截器的执行流程 1.对Action进行预处理.(正序执行) 2.拦截器自身决定该不该执行后续的拦截器(由invoke()方法的返回值决定).