拦截器

1 拦截器的作用:访问日志(记录访客的IP、来源)、在线同级人数、省份验证等
2 默认不会被拦截的路径

classpath:/META-INF/resources
classpath:/resources
classpath:/static
classpath:/public
classpath:datafile

3 如何配置路径不被拦截
application.properties文件中写:

spring.resources.static-locations=/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:datafile/,

多个路径用逗号隔开
上面几个路径是默认不被拦截的,要是配置了其他路径就一定要加上上面几个路径,不然会被配置的路径顶替掉
3 自定义拦截器
3.1 创建一个类(这个类就是拦截器执行类,真正执行拦截的)MyInterceptor:实现HandlerInterceptor接口,重写该接口的3个抽象方法
preHandle:预置
postHandle:请求之后
afterCompletion:完成之后
自定义的拦截的逻辑写在preHandle中
preHandle方法中默认false:相当于中断请求;
将默认的返回false改为true:这样拦截器配置类里过滤的请求才能请求成功
一般情况下过滤的都是:首页、登录页、这册页

import com.longteng.lesson2.my.myuser.MyUser;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MyInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse, Object o) throws Exception {
//获取session,判断session是否为空,为空重定向到表单未提交状态页面
    HttpSession httpSession=httpServletRequest.getSession();
    MyUser myUser=(MyUser) httpSession.getAttribute("myUser");
    if(myUser==null){
        httpServletResponse.sendRedirect("/test/formTest");
        return false;
    }
    return true;
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}
}

3.2 创建一个拦截器配置类:配置哪些路径是拦截的、哪些路径是被过滤不被拦截的:InterceptorConfig,该类上要添加@Configuration注解

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyInterceptorConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//在配置类中实例化自定义的拦截器执行类
    MyInterceptor myInterceptor=new MyInterceptor();
    //添加该自定义拦截器的实例:addPathPatterns拦截所有路径
    //excludePathPatterns:过滤掉不被拦截的路径
        registry.addInterceptor(myInterceptor).
                addPathPatterns("/**").
                excludePathPatterns("/test/formTest").
                excludePathPatterns("/test/submitTest");
    super.addInterceptors(registry);
}
}

请求表单页/my/myIndex.ftl中的内容(与“form表单”文档相同)

<form accept-charset="UTF-8"
  action="/test/submitTest"
  autocomplete="off"
  method="post">
<table>
    <tr>
        <td>
            姓名:<input type="text" name="userName" maxlength="10" placeholder="请输入用户名" autocomplete="off" required/>
        </td>
    </tr>
    <tr>
        <td>
            密码:<input type="password" name="password" maxlength="20" placeholder="请输入密码" autocomplete="off" required/>
        </td>
    </tr>
    <tr>
        <td>
            姓别:
            <input type="radio" name="sex" value="1" checked/>男
            <input type="radio" name="sex" value="0"/>女
        </td>
    </tr>
    <tr>
        <td>
            偏好:
            <input type="checkbox" name="Interest" value="Music">音乐
            <input type="checkbox" name="Interest" value="motion">运动
            <input type="checkbox" name="Interest" value="travel">旅行
        </td>
    </tr>
    <tr>
        <td>
            邮箱:
            <input type="email" name="email" placeholder="请输入邮箱地址">
        </td>
    </tr>
    <tr>
        <td>
            居住地:
            <select name="city">
                <option value="HongKong">HongKong</option>
                <option value="Seoul">Seoul</option>
                <option value="Tokyo">Tokyo</option>
        </td>
    </tr>
    <tr>
        <td>
            <span style="color: red">${message!}</span>
        </td>
    </tr>
    <tr>
        <td>

            <input type="reset" name="reset" value="重置">
            <input type="submit" name="submit" value="提交">
        </td>
    </tr>
</table>

表单提交后的页面/my/submit.ftl中的内容

表单提交成功,进入本页面

controller里2个请求接口,1 请求表单页 2 提交表单页(与“form表单”文档相同)

import com.longteng.lesson2.my.myuser.MyUser;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/test")
public class SpringBootTest {
private final String NAME="qwer";
private final String PASSWORD="1234";
//请求表单接口
@RequestMapping("/formTest")
public ModelAndView formTest() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("/my/myIndex");
    return modelAndView;
}

@RequestMapping("/submitTest")
//表单页提交按钮的请求接口
public ModelAndView submitTest(MyUser myUser,HttpServletRequest request){
    ModelAndView modelAndView=new ModelAndView();
    String name=myUser.getUserName();
    String password=myUser.getPassword();
    if (name.equalsIgnoreCase(NAME)&&password.equalsIgnoreCase(PASSWORD)){
        request.getSession().setAttribute("myUser",myUser );
        modelAndView.setViewName("/my/submit");
    }else {
        modelAndView.addObject("message", "姓名或密码错误");
        modelAndView.setViewName("/my/myIndex");
    }
    return modelAndView;
}
}

1 请求127.0.0.1:8080 进入 127.0.0.1:8080/test/formTest该链接请求返回的是/my/myIndex 如下图;因为这个时候myuser是null被重定向到了/test/formTest路径(这个判断是在拦截器执行类里做的)
在这里插入图片描述
2 在上一个页面上姓名、密码不为空、判错通过的情况下提交到127.0.0.1/my/submit
3 再一次请求127.0.0.1:8080这个时候myuser已经不为空了,请求成功,不再被拦截

拦截器是spring框架的,如果不使用spring的工程,用传统的工程只能用过滤器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值