Spring-mvc拦截器

本文介绍了如何在Spring MVC中使用拦截器实现权限控制。通过实现HandlerInterceptor接口创建拦截器,配置拦截器拦截特定路径,并在preHandle方法中进行权限判断。示例包括拦截器类的编写、配置、以及登陆和显示页面的处理。在实际应用中,拦截器可以用于判断用户是否登录、权限验证等场景,确保系统安全。
摘要由CSDN通过智能技术生成

Spring-mvc拦截器

拦截器

在开发一个网站时可能有这样的需求:某些页面只希望几个特定的用户浏览。对于这样的访问权限控制,应该如何实现呢?拦截器就可以实现上述需求。在 Struts 2 框架中,拦截器是其重要的组成部分,Spring MVC 框架也提供了拦截器功能。

Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

拦截器的定义
在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置,定义一个拦截器可以通过两种方式:一种是通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类来定义;另一种是通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义

我们今天使用实现HandlerInterceptor接口的方式来实现我们的拦截器

步骤1

首先我们要创建一个空白的MAVEN工程 并加以web支持

步骤2

导入pom.xml所需要的依赖

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>

    <!--Servlet - JSP -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

</dependencies>

步骤3
在Resources下创建spring-mvc.xml文件
代码如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context.xsd
   http://www.springframework.org/schema/mvc
   https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 配置SpringMVC -->
    <!-- 1.开启SpringMVC注解驱动 -->
    <mvc:annotation-driven />

    <!-- 2.静态资源默认servlet配置-->
    <mvc:default-servlet-handler/>

    <!-- 3.配置jsp 显示ViewResolver视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp" />
    </bean>
    <mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.zhang.lan.Userinterceptors"></bean>
    </mvc:interceptor>
</mvc:interceptors>

<context:component-scan base-package="com.zhang.controller" />

</beans>

细心的同学会发现这里的mvc多了一块
这里用来配置拦截器

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <!--拦截器实现类路径-->
        <bean class="com.zhang.lan.Userinterceptors"></bean>
    </mvc:interceptor>
</mvc:interceptors>

步骤3
(1)创建拦截器实现类Userinterceptors
(2)创建完成后实现HandlerInterceptor接口
用spring-mvc的最大特点就是它能将我们所需要的大部分业务已经完成好封装 我们只需按照它的方式来使用它即可
(3)实现HandlerInterceptor的方法 这里我们只需要实现preHandle方法即可
代码如下:

public class Userinterceptors implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              //如果拦截返回false 如果成功返回true
              //我们就可以通过一些条件判断来决定是否拦截网页
        return false;
    }
}

步骤4
(1)编写index.jsp页面
主显示页面
进入login进入登陆界面
进入tiao进入显示界面
当然如果没有输入正确的密码 我们就应当拦截该请求让他跳转到我们的登陆界面

 <h1><a href="${pageContext.request.contextPath}/login">用户登陆</a></h1>
  <a href="${pageContext.request.contextPath}/tiao">显示</a>

(2)创建登陆界面login.jsp

<html>
    <head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/success" method="post">
    <input type="text" name="name">
    <input type="password" name="pass">
    <input type="submit" value="提交">
</form>

</body>
</html>

数据提交后跳转到success方法处理

(3)如果成功跳转到显示页面show.jsp

<body>
欢迎您
</body>

步骤5
创建控制层(Controller类)

@org.springframework.stereotype.Controller
public class Controller {

    @RequestMapping("/success")
    public String login(String name, String pass, HttpSession session, Model model){
       session.setAttribute("names",name);//将输入的name放入到session中 让拦截器判断是否为空值
        System.out.println("name>=="+name);
       model.addAttribute("msg",name);
        return "show";
    }


    @RequestMapping("/tiao")
    public String next()
    {
        return "show";

    }


    @RequestMapping("/login")
    public String l(){
        return "login";
    }

}

步骤6
配置Tomcat运行测试
运行之后发现所以请求都被拦截

这时候我们就思考 什么时候拦截什么时候放行?
在这里插入图片描述
解决办法
(1)点击用户登陆 我们要跳转到登陆界面 所以请求应该被放行
(2)进入登陆界面后输入数据提交 判断登陆是否正确或者是否为空值
(3)登陆表单提交后 要交给后台来判断 放行登陆判断

既然想到了解决办法
那么我们就回到HandlerInterceptor实现类

HttpSession session=request.getSession();
//放行登陆界面  request.getRequestURI().contains("login")等于到当前路径下包含login的所有请求  为真放行
        if (request.getRequestURI().contains("login")){
             return true;
      }
//放行提交表单后的判断
        if (request.getRequestURI().contains("success")){
            return true;
        }

//判断session中的值是否为空值
       if(session.getAttribute("names")!=null){
           return true;
       }

  //没登陆或者登陆的值为空或者错误 重现重定向到登陆界面
       request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);

编写完成 继续测试
点击显示 请求被拦截 进入登陆界面
在这里插入图片描述

输入数据(这里只坐了一个是否为空的判断) 再登陆
在这里插入图片描述
登陆成功
在返回 直接点显示按钮 发现也能进入后台
那是因为session的值一直在服务器中保存 他始终为真
要想清除session的值 我们在退出的方法中加入
session.removeAttribute(“names”);

 @RequestMapping("/tuichu")
    public String tui(HttpSession session){
      session.removeAttribute("names");
        return "login";
    }

返回登陆后只能重新登陆才能访问

总结
拦截器用于加密我们的项目系统 更加安全 拦截器拦截所有请求 每个方法执行前先调用拦截器 让拦截器来判断是否放行
关于拦截登陆问题
放行登陆界面
放行登陆后的后台处理
判断登陆是否正确或者是否为空值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值