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的工程,用传统的工程只能用过滤器