SpringMVC interceptor拦截器

news/2025/2/23 21:56:13

这是和登录有关的拦截器

创建拦截器的实现类
重写它的3个方法

@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("username");

        if (user != null) {
            return true;
        }
        //重定向到登录
        response.sendRedirect("/login");
        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 {

    }
}

在xml中配置拦截器


<mvc:interceptors>

        <mvc:interceptor>
            <!--配置哪些地址需要走拦截器, 这个配置可以同时写多个-->
            <mvc:mapping path="/**"/>
            <!--排除哪些地址-->
            <mvc:exclude-mapping path="/category/view"/>
            <mvc:exclude-mapping path="/alogin"/>
            <mvc:exclude-mapping path="/login"/>
            <mvc:exclude-mapping path="/book/create"/>
            <mvc:exclude-mapping path="/book/delete"/>
            <mvc:exclude-mapping path="/book/update"/>
            <mvc:exclude-mapping path="/book/query"/>

</mvc:interceptors>

获取前端参数

package com.lanou.demo.controller;

import com.lanou.demo.annotation.CheckPermission;
import com.lanou.demo.interceptor.PermissionInterceptor;
import com.lanou.demo.service.VerifyCodeUtils;
import com.lanou.demo.service.VerifyCodeView;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.Map;

@Controller
public class VerificationCodeController {
    

    
    @RequestMapping("/category/view")
    public ModelAndView view(HttpSession session){
        //创建ModelAndView 对象
        ModelAndView mv = new ModelAndView();
        //取出验证码
        String code = VerifyCodeUtils.generateVerifyCode(4);
        //添加到ModelAndView
        session.setAttribute("code",code);
         mv.addObject("code",code);
         //添加视图
        mv.setView(new VerifyCodeView());
        return  mv;

    }


    
    @RequestMapping("/alogin")
    public String doLogin(String username,
                          String password,
                          String code,
                          HttpSession session){


        String sessionCode = (String) session.getAttribute("code");
        if ("admin".equals(username) && "admin".equals(password)){
            if (sessionCode.equalsIgnoreCase(code)){
                // 验证过一次之后, 移除到验证码
                session.removeAttribute("code");
                //把用户名添加到session
                session.setAttribute("username", username);
                //获取许可证
                String[] permissions = {"book/query","alogin","book/create"};
                //把许可证添加到session
                session.setAttribute("permissions", Arrays.asList(permissions));
                // 重定向到/home页面
                return "/home";
        }
        }
        //如果不符合if判断就重定向到error页面
         return "/error";


    }

    @CheckPermission("book/query")
    @RequestMapping("/book/query")
    public String select(){

        return "/succeed";
    }



}

要是登陆的话有些需要获取权限
配合拦截器去做一个权限设置

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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

@Component
public class PermissionInterceptor implements HandlerInterceptor {

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


        // 1. 从session中取出用户所拥有的权限
        HttpSession session = request.getSession();
        List<String> permissions = (List<String>) session.getAttribute("permissions");
        // 2. 获取到当前的请求所对应的Handler上的CheckPermission注解中的value的值
        HandlerMethod hm = (HandlerMethod) handler;
        // 判断当前的Handler方法上是否有这个注解
        if (hm.hasMethodAnnotation(CheckPermission.class)) {
            // 获取到注解对象
            CheckPermission annotation = hm.getMethodAnnotation(CheckPermission.class);
            // 获取到value的值
            String value = annotation.value();
            // 判断value是否在用户权限的集合中
            if (permissions.contains(value)) {


                return true;
            }
        }

        response.sendRedirect("/login");

        return false;
    }
}

在自定义一个注解,用来判断什么时候来使用

package com.lanou.demo.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

    String value();

}

再在xml中配置权限的拦截器


    <mvc:interceptors>

        <!--登录使用的拦截器-->

        <mvc:interceptor>
            <!--配置哪些地址需要走拦截器, 这个配置可以同时写多个-->
            <mvc:mapping path="/**"/>
            <!--排除哪些地址-->
            <mvc:exclude-mapping path="/category/view"/>
            <mvc:exclude-mapping path="/alogin"/>
            <mvc:exclude-mapping path="/login"/>

            <!--配置上面的地址映射会走哪个拦截器-->
            <ref bean="testInterceptor"/>
        </mvc:interceptor>


        <!--权限使用的拦截器-->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/login"/>
            <mvc:exclude-mapping path="/alogin"/>
            <mvc:exclude-mapping path="/category/view"/>

            <ref bean="permissionInterceptor"/>
        </mvc:interceptor>

    </mvc:interceptors>

注意拦截器一定要使用的恰当

转载于:https://www.cnblogs.com/lxx-1843693653/p/10922690.html


http://www.niftyadmin.cn/n/712372.html

相关文章

常见shell操作

一、find命令详细 find命令 -- 之查找指定时间内修改过的文件 比如我们要查找linux下指定时间内做过改动的文件&#xff0c;我们可以用find命令&#xff0c;其实find命令的功能十分强大&#xff0c;下面我们通过几个简单的例子来学习下find命令的简单用法&#xff1a; find /op…

python struct 用法_Python标准库笔记struct模块的使用

最近在学习python网络编程这一块&#xff0c;在写简单的socket通信代码时&#xff0c;遇到了struct这个模块的使用&#xff0c;当时不太清楚这到底有和作用&#xff0c;后来查阅了相关资料大概了解了&#xff0c;在这里做一下简单的总结。了解c语言的人&#xff0c;一定会知道s…

从人机大战看智能安防三大趋势

安防三大智能化趋势 在安防智能化进程中&#xff0c;实际上要解决三个问题&#xff1a;数据结构化、业务智能化、应用大数据化。总的来说就是三大智能化趋势&#xff1a;结构化的智能、业务的智能、大数据的智能。 由于安防本身业务应用的需求决定了安防人工智能市场的潜在需求…

java建立二叉查找树_Java创建二叉搜索树,实现搜索,插入,删除的操作实例

Java实现的二叉搜索树&#xff0c;并实现对该树的搜索&#xff0c;插入&#xff0c;删除操作(合并删除&#xff0c;复制删除)首先我们要有一个编码的思路&#xff0c;大致如下&#xff1a;1、查找&#xff1a;根据二叉搜索树的数据特点&#xff0c;我们可以根据节点的值得比较来…

Python笔记_第四篇_高阶编程_实例化方法、静态方法、类方法和属性方法概念的解析。...

1.先叙述静态方法&#xff1a; 我们知道Python调用类的方法的时候都要进行一个实例化的处理。在面向对象中&#xff0c;一把存在静态类&#xff0c;静态方法&#xff0c;动态类、动态方法等乱七八糟的这么一些叫法。其实这些东西看起来抽象&#xff0c;但是很好理解。这里面有一…

web前端学习(九)——HTML5区块与布局的相关标签设置

1.HTML5中区块的设置 大多数 HTML 元素被定义为块级元素或内联元素。 块级元素在浏览器显示时&#xff0c;通常会以新行来开始&#xff08;和结束&#xff09;。 实例&#xff1a;<h1>&#xff0c;<p>&#xff0c;<ul>&#xff0c;<table>。 内联元素在…

Linux下安装LoadRunner(LoadGenerator)

1. 在HP的官方网站上下载LoadRunner9.5 的Linux安装程序[T7177-15009.iso]&#xff0c;安装文档[hp_man_LRIG9.50_01_pdf.pdf]&#xff1b; 安装程序包括Hp、Ibm、Linux、Solaris系统的支持&#xff08;LR9.0对应安装文件为[TLRNUX900WC_00.zip]&#xff09;。 2. 安…

java web应用目录结构_java web应用目录结构

java web应用目录结构(2014-08-29 23:22:09)标签&#xff1a;根目录web应用程序目录文件存放处分类&#xff1a;JSP应用程序目录&#xff1a;Web应用程序的根目录。如图所示的根目录myWebApp。Web应用程序的文件组织结构/WEB-INF目录&#xff1a;Web应用应用部署目录&#xff0…