springMVC(七):Interceptor
概述
- SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。
- 过滤器与拦截器的区别:拦截器是AOP思想的具体应用。
过滤器:
- servlet规范中的一部分,任何java web工程都可以使用
- 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截
拦截器:
- 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
- 拦截器只会拦截访问的控制器Controller方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的
实现简单的拦截器
- 想要实现拦截器,必须实现HandlerInterceptor 接口。
- 配置好环境,确保环境正确
- 编写一个类MyInterceptor实现HandlerInterceptor 接口
1 | public class MyInterceptor implements HandlerInterceptor { |
- 在springMVC的配置文件中配置拦截器
编写了拦截器就一定要在拦截器中配置,配置使用了AOP思想,相当于容器给我们定义了一个切面1
2
3
4
5
6
7
8
9
10
11<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--/** 包括路径及其子路径-->
<!--/admin/* 拦截的是/admin/add等等这种admin下的所有一级目录, /admin/add/user不会被拦截-->
<!--/admin/** 拦截的是/admin/下的所有-->
<mvc:mapping path="/**"/>
<!--bean配置的就是拦截器的那个类-->
<bean class="com.hanser.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
实现登录拦截
首先搭建环境,确保环境无误后,开始进行开发
- 1.欢迎界面index.jsp,设置界面跳转(进入首页和进入登陆界面)
1
2<h1><a href="${pageContext.request.contextPath}/user/main" methods="post">进入首页</a> </h1>
<h1><a href="${pageContext.request.contextPath}/user/toLogin" methods="post" >登录</a> </h1> - 2.登陆界面WEB-INF/jsp/login.jsp
1
2
3
4
5
6
7<form action="${pageContext.request.contextPath}/user/login" method="post">
用户名:<input type="text" name="username">
<br/>
密码:<input type="password" name="password">
<br/>
<input type="submit" name="提交">
</form> - 3.首页WEB-INF/jsp/main.jsp
1
2
3
4
5<h1>
我是首页
<span>${username}</span>
<a href="/user/logOut">注销</a>
</h1> - 4.后端Controller层的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class LogInController {
//从login.jsp获取用户名和密码,存入session,并跳转到首页
public String login(String username, String password, Model model, HttpSession session){
System.out.println(username);
if(!username.equals("")){
session.setAttribute("username",username);
model.addAttribute("username",username);
}
return "main";
}
//跳转到登陆界面
public String toLogin(){
return "login";
}
//跳转到首页main
public String toMain(){
return "main";
}
}
这样,我们能从欢迎页点首页直接进入,也可以点登录,登录之后进入,但是我们要实现,必须登录,没有登陆不能进入首页
实现登录拦截,就需要设置拦截器了,通常是采用session来进行判断,登录时,向session中存入一个值,在拦截器中判断
session中这个值是否为空1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
System.out.println("进入拦截器");
if(session.getAttribute("username")!=null){
return true;
}
if(request.getRequestURI().contains("gin")){
return true;
}
request.getRequestDispatcher("/WEB-INF/jsp/error.jsp").forward(request,response);
return false;
}
}