SpringMVC使用拦截器

拦截器

拦截器与过滤器的区别

拦截器是AOP思想的具体应用

过滤器

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

拦截器

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

自定义拦截器

必须实现HandlerInterceptor接口

  1. 新建Moudel

  2. 配置web.xml和applicationContext.xml

    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:applicationContext.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>encoding</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>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    </web-app>
    

    applicationContext.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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <!--    自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
        <context:component-scan base-package="com.lzj.controller"/>
        <!--    让SpringMVC不处理静态资源-->
        <mvc:default-servlet-handler/>
        <!--    自动完成BeanNameUrlHandlerMapping和SimpleControllerHandlerAdapter实例的注入-->
        <mvc:annotation-driven/>
    
        <!--解决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>
    
        <!--    视图解析器-->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--        前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--        后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
        
    </beans>
    
  3. 编写控制器类

    @RestController
    public class TestController {
        @RequestMapping("/t1")
        public String test(){
            System.out.println("TestController=>启动了");
            return "ok";
        }
    }
    
  4. 编写拦截器类

    public class MyInterceptor implements HandlerInterceptor {
        //return true:先执行下一个拦截器,放行
        //return false:不执行下一个拦截器
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("====处理前=====");
            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("====清理=====");
        }
    }
    
  5. 在springmvc的配置文件中配置拦截器

    <!--    拦截器配置-->
        <mvc:interceptors>
            <mvc:interceptor>
    <!--            包括这个请求下面的所有的请求-->
                <mvc:mapping path="/**"/>
                <bean class="com.lzj.config.MyInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
  6. 测试

    在这里插入图片描述

登录判断验证【实战】

需求:判断用户是否登录,若登录了则可以进入首页(main.jsp),否则只能进入登陆页面

实现:用户登陆后增加session,通过拦截器判断是否有session来拦截

  1. 配置web.xml和applicationContext.xml

  2. 编写控制器类

    @Controller
    @RequestMapping("/user")
    public class LoginController {
        @RequestMapping("/login")
        public String login(HttpSession session,String username, String password,Model model){
            //把用户的信息存在session中
            session.setAttribute("username",username);
            model.addAttribute("username",username);
            return "main";
        }
        @RequestMapping("/goLogin")
        public String login(){
    
            return "login";
        }
        @RequestMapping("/main")
        public String main(){
    
            return "main";
        }
    
        @RequestMapping("/goOut")
        public String login(HttpSession session){
            //把用户的信息存在session中
            session.removeAttribute("username");
            return "redirect:/index.jsp";
        }
    }
    
  3. 编写拦截器类

    public class LoginInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            HttpSession session = request.getSession();
            //放行:判断什么条件下登录
            //登录页面也放行
            //如果访问页面的url中包含login则放行
            if(request.getRequestURI().contains("login")){
                return true;
            }else if(session.getAttribute("username")!=null){
                return true;
            }
    
            //判断什么条件下没有登录
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
            return false;
        }
    }
    
  4. 在springmvc的配置文件中配置拦截器

    <!--    拦截器配置-->
        <mvc:interceptors>
            <mvc:interceptor>
                <!--            包括这个请求下面的所有的请求-->
                <mvc:mapping path="/user/**"/>
                <bean class="com.lzj.config.LoginInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
  5. 编写jsp文件,在WEB-INF文件夹下创建jsp文件夹

    index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <h1><a href="/user/goLogin">登录页面</a></h1>
      <h1><a href="/user/main">首页</a></h1>
      </body>
    </html>
    

    main.jsp

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

    login.jsp

    <%--
      Created by IntelliJ IDEA.
      User: 86158
      Date: 2022/2/24
      Time: 22:52
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录页面</title>
    </head>
    <body>
    <%--在WEB-INF下的所有页面或者资源,只能通过controller,或者servlet进行访问--%>
    
    <h1>登陆页面</h1>
    <form action="${pageContext.request.contextPath}/user/login" method="post">
        用户名:<input type="text" name="username">
        密码:  <input type="text" name="password">
        <input type="submit" value="提交">
    </form>
    
    </body>
    </html>
    
  6. 项目结构

    在这里插入图片描述

  7. 测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的大雄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值