基于SpringMVC的拦截器

基于SpringMVC的拦截器

SpringMVC的拦截器就像是我们以前在WEB项目里面写的filter过滤器,但是它又一样。

  • 首先是以前的过滤器是需要我们手动过滤掉静态资源,但是SpringMVC里面的拦截器是可以自动过滤的
  • 第二点就是拦截器需要注册在SpringMVC上面去
  • 拦截器的效率更高代码更容易写。
  • 拦截器的原理其实就是aop,它里面比较重要的三个方法,preHandle(req,resp,handler),postHandle,afterCompletion,都是横切过去的方法。我们可以通过preHandle来做主要拦截请求。

下面将会给出简单的案例一起学习(狂神的案例)。

说到拦截器,什么时候会需要使用拦截器呢?
我们登陆之前是不能够访问一些主页或者是个人页面的,那么这个时候是怎么做的呢?
没错我们以前可以使用过滤器,现在可以使用拦截器,来检测是否有用户已经登陆了。通常我们建立服务器与浏览器的会话,大部分时间都是可以使用session来进行对数据的存储,我们可以把用户的简要信息存储在session的键值对里面。

下面就是一个简单的登录验证的拦截器案例

先给出步骤

  1. 首先配置环境spring-mvc,注册映射器和适配器,过滤静态资源,视图解析器。别忘了在web.xml里面注册请求分发器和字符集处理器
  2. 创建前端页面,login页面,main页面,index页面
  3. 创建LoginController来接收处理请求,里面需要有跳转main页面,跳转login页面,login之后跳转main页面,注销方法(这里的注销会先跳到main页面并且把用户注销,第二次点击才会被拦截)。
  4. 创建LoginInterceptor,并且明确需要拦截什么样的请求。

可能遇到的问题
①前端组件的name没有写
②跳转的页面链接
③web项目没有导入jar包
④忘了注册拦截器

代码(spring-mvc)

<?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
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--    扫描-->
    <context:component-scan base-package="com"/>


    <!--    过滤资源-->
    <mvc:default-servlet-handler/>

    <!--    视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--映射器和适配器和json的防止乱码-->

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

<!--    配置拦截器,跟过滤器相似,但是又不一样-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.kuang.interceptor.MyInterceptor" id="interceptor">
            </bean>
        </mvc:interceptor>
        
<!--        登录拦截器-->
        <mvc:interceptor>
            <mvc:mapping path="/user/**"/>
            <bean id="interceptor2" class="com.kuang.interceptor.LoginInterceptor">
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>

</beans>

代码(web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!--   请求分发器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

<!--    字符集乱码处理过滤器-->

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>filter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

代码(login.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login" method="get">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit" value="提交">
</form>

</body>
</html>

代码(main.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>首页</h1>
<span>${sessionScope.userInfo}</span>
<p>
    <a href="${pageContext.request.contextPath}/user/goOut">注销</a>
</p>


</body>
</html>

代码(index.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>首页</h1>
<span>${sessionScope.userInfo}</span>
<p>
    <a href="${pageContext.request.contextPath}/user/goOut">注销</a>
</p>


</body>
</html>

代码(Controller)

package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/user")
public class LoginController {
//跳转登录页面
    @RequestMapping("/goLogin")
    public String goLogin(){
        return "login";
    }
//    登录并且注册用户
    @RequestMapping("/login")
    public String login(HttpSession session,String username,String password){
        session.setAttribute("userInfo",username);
        System.out.println("登录成功");
        return "main";
    }
//跳转到主要页面
    @RequestMapping("/main")
    public String goMain(){
        return "main";
    }
//注销
    @RequestMapping("/goOut")
    public String goOut(HttpSession session){
        session.removeAttribute("userInfo");
        return "main";
    }
}

代码(拦截器)

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        如果是登录可以过去
        if(request.getRequestURI().contains("login")){
            System.out.println("login开始处理");
            return true;
        }
//        如果是要去到登录页面也可以过去后端
        if(request.getRequestURI().contains("goLogin")){
            System.out.println("goLogin开始处理");
            return true;
        }

//        如果已经有登录信息就可以不拦截
        if(request.getSession().getAttribute("userInfo")!=null){
            System.out.println("我也开始处理了");
            return true;
        }

        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);

//        请求不通过,不能够访问后端服务器
        return false;


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值