拦截器「建议收藏」

拦截器「建议收藏」11.拦截器11.1拦截器概述SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。*

大家好,又见面了,我是你们的朋友全栈君。

11. 拦截器

11.1 拦截器概述

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。

过滤器与拦截器的区别:拦截器是AOP思想的具体应用。

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

11.1 自定义拦截器

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("请求处理之前-----------");
        //返回true就放行继续执行,返回false就不执行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("请求处理后----------");
        //请求处理方法执行之后执行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("清理--------------");
        //在DispatcherServlet处理后执行,做清理工作.
    }
}

在配置文件中进行配置

<!--关于拦截器的配置-->
<mvc:interceptors>
   <mvc:interceptor>
       <!--/** 包括路径及其子路径-->
       <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
       <!--/admin/** 拦截的是/admin/下的所有-->
       <mvc:mapping path="/**"/>
       <!--bean配置的就是拦截器-->
       <bean class="com.wyz.interceptor.MyInterceptor"/>
   </mvc:interceptor>
</mvc:interceptors>
@Controller
public class InterceptorController {
    @RequestMapping("/test")
    @ResponseBody
    public String test(){
        System.out.println("控制器中的方法执行");
        return "hello";
    }
}
<a href="${pageContext.request.contextPath}/interceptor">拦截器测试</a>

拦截器「建议收藏」

登录页面测试:

1、有一个登陆页面,需要写一个controller访问页面。

2、登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。返回登陆成功。

3、拦截用户请求,判断用户是否登陆。如果用户已经登陆。放行, 如果用户未登陆,跳转到登陆页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<h1>登录页面</h1>
<form action="${pageContext.request.contextPath}/user/login" method="post">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="text" name="password"><br/>
    <input type="submit" value="登录">
</form>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/login")
    public String login(HttpSession session,String username, String password){
        System.out.println("接受前端消息:" + username);
        session.setAttribute("username",username);
        return "success";
    }

    //跳转到登录页面
    @RequestMapping("/goLogin")
    public String goLogin(){
        return "login1";
    }
    @RequestMapping("/goSuccess")
    public String goSuccess(){
        return "success";
    }
    //退出登录
    @RequestMapping("/logOut")
    public String logOut(HttpSession session){
        session.invalidate();
        return "login1";
    }

}

登录成功

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>登录成功</h1>
${username}
<a href="${pageContext.request.contextPath}/user/logOut">注销</a>
</body>
</html>

index页面测试

<a href="${pageContext.request.contextPath}/user/goLogin">登录</a>
<a href="${pageContext.request.contextPath}/user/goSuccess">首页</a>

登录拦截器

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 如果是登陆页面则放行
        System.out.println("uri: " + request.getRequestURI());
        if (request.getRequestURI().contains("login")) {
            return true;
        }

        HttpSession session = request.getSession();

        // 如果用户已登陆也放行
        if(session.getAttribute("username") != null) {
            return true;
        }

        // 用户没有登陆跳转到登陆页面
        request.getRequestDispatcher("/WEB-INF/jsp/login1.jsp").forward(request, response);
        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 {

    }


}

对拦截器进行配置

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.wyz.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155745.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • goland20.3.2激活码_通用破解码

    goland20.3.2激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • oracle unpivot 索引_Pivot 和 Unpivot[通俗易懂]

    oracle unpivot 索引_Pivot 和 Unpivot[通俗易懂]Pivot和Unpivot使用简单的SQL以电子表格类型的交叉表报表显示任何关系表中的信息,并将交叉表中的所有数据存储到关系表中。Pivot如您所知,关系表是表格化的,即,它们以列-值对的形式出现。假设一个表名为CUSTOMERS。SQL>desccustomersNameNull?Type–…

    2022年10月26日
  • camera(二) DVP接口「建议收藏」

    camera(二) DVP接口「建议收藏」ov26401632*1232sccb总线一个点8位10位uxga15帧/s(1632*1232)svga30(800*600)cif60(352*288)如果芯片被初始化为x*y,那么是横方向有x个像素,纵方向有y个像素。如何初始化,一般芯片都有初始化序列然后图像从D0-D14过来。(D0-D14是一个像素)PCLK用来同步一个像素的数据。…

  • javaweb权限管理简单实现_javaweb管理系统项目

    javaweb权限管理简单实现_javaweb管理系统项目推荐最新技术springboot版权限管理(java后台通用权限管理系统(springboot)),采用最新技术架构,功能强大!注:由于该项目比较老,所以没有采用maven管理,建议下载springboot权限管理系统,对学习和使用会更有帮助。springboot权限管理系统介绍地址:https://blog.csdn.net/zwx19921215/article/details/978……………

    2022年10月23日
  • linux抓包命令到文件,Linux下抓包命令tcpdump详解「建议收藏」

    linux抓包命令到文件,Linux下抓包命令tcpdump详解「建议收藏」tcpdump是一个命令行实用程序,可用于捕获和检查进出系统的网络流量。它是网络管理员中用于排除网络问题和安全测试的最常用工具。尽管名称如此,使用tcpdump,您也可以捕获非TCP流量,例如UDP,ARP或ICMP。捕获的数据包可以写入文件或标准输出。tcpdump命令最强大的功能之一是它能够使用过滤器并仅捕获要分析的数据。在本文中,我们将介绍如何在Linux中使用tcpdump命令的基础…

  • vue父组件给子组件传值,子组件接收值不变_父子组件传值

    vue父组件给子组件传值,子组件接收值不变_父子组件传值Vue是一个轻量级的渐进式框架,对于它的一些特性和优点在此就不做赘述,本篇文章主要来探讨一下Vue子父组件通信的问题首先我们先搭好开发环境,我们首先得装好git和npm这两个工具环境搭建步骤:打开git,运行npminstall–globalvue-cli这是安装vue的命令行 vueinitwebpackvue-demo这是vue基于webpack的模板项目…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号