一、拦截器概念
二、实现拦截器
- 实现HandlerInterceptor接口
publicclass
MyInterceptor
implementsHandlerInterceptor {
//在请求处理的方法之前执行
//如果返回true那么执行下一个拦截器,如果返回false那么不执行下一个拦截器
publicbooleanpreHandle(HttpServletRequest
request, HttpServletResponse
response,
Objecthandler)
throwsException {
System.out.println("--------处理前--------");
returntrue;
}
//在请求处理的方法执行之后执行
publicvoid
postHandle(HttpServletRequest
request, HttpServletResponse
response,
Objecthandler,
ModelAndViewmodelAndView)throws
Exception {
System.out.println("--------处理后--------");
}
//在DispatcherServlet处理后执行---清理工作
publicvoid
afterCompletion(HttpServletRequest
request, HttpServletResponse
response,
Objecthandler, Exceptionex)
throwsException {
//TODO
Auto-generated method stub
}
}
- 配置拦截器
<beansxmlns="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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- /** 包括路径及其子路径 - 拦截所有的Controller
如果是/admin/* 拦截的是 /admin/add,/admin/list etc. /admin/user/add不被拦截
如果是/admin/** 拦截的是 /admin/add,/admin/list,/admin/user/add
-->
<mvc:mappingpath="/**"/>
<!-- 对应的拦截器 -->
<beanclass="com.liujie.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
- 如果被拦截-能否到达指定的页面?
使用HttpServletResponse或者HttpServletRequest可以实现转发或重定向 |
//在请求处理的方法之前执行
//如果返回true那么执行下一个拦截器,如果返回false那么不执行下一个拦截器
publicbooleanpreHandle(HttpServletRequest
request, HttpServletResponse
response,
Objecthandler)
throwsException {
System.out.println("--------处理前--------");
System.out.println(request.getContextPath());
response.sendRedirect(request.getContextPath()
+ "/index.jsp");
returnfalse;
}
这里被拦截的情况就是:return false; |
return false;
|
|
return true;
|
|
- 拦截器应用-登录拦截器
Controller
|
@Controller
publicclass
UserController {
@RequestMapping(value ="/login")
publicString login(User
user, HttpSession
session) {
if("siggy".equals(user.getName())
&& "111".equals(user.getPwd())) {
session.setAttribute("user",user);
return"redirect:/index.jsp";
}
return"redirect:/login.jsp";
}
@RequestMapping("/add")
publicString add() {
System.out.println("add");
return"redirect:/index.jsp";
}
}
|
拦截器
|
publicclass
LoginInterceptor
implementsHandlerInterceptor {
//允许哪些url不被拦截,哪些需要被拦截
privateList<String>
allowedPass;
publicbooleanpreHandle(HttpServletRequest
request, HttpServletResponse
response,
Objecthandler)
throwsException {
Stringurl
=
request.getRequestURL().toString();
//先判断session中是否有
Objectuser
=
request.getSession().getAttribute("user");
if(user!=
null) {
returntrue;
}
for(Stringtemp
:
allowedPass) {
if(url.endsWith(temp))
{
returntrue;
}
}
response.sendRedirect(request.getContextPath()
+ "/login.jsp");
returnfalse;
}
publicvoid
postHandle(HttpServletRequest
request, HttpServletResponse
response,
Objecthandler,
ModelAndViewmodelAndView)throws
Exception {
}
publicvoid
afterCompletion(HttpServletRequest
request, HttpServletResponse
response,
Objecthandler, Exceptionex)
throwsException {
}
publicvoid
setAllowedPass(List<String>
allowedPass) {
this.allowedPass=
allowedPass;
}
}
|
配置
|
<!-- 拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- /** 包括路径及其子路径 - 拦截所有的Controller
如果是/admin/* 拦截的是 /admin/add,/admin/list etc. /admin/user/add不被拦截
如果是/admin/** 拦截的是 /admin/add,/admin/list,/admin/user/add
-->
<!--
<mvc:mapping path="/product/*"/>
<mvc:mapping path="/cart/*"/>
<mvc:mapping path="/order/*"/>
<mvc:exclude-mapping path="/user/*"/>
-->
<mvc:mappingpath="/**"/>
<!-- 对应的拦截器 -->
<beanclass="com.liujie.interceptor.LoginInterceptor">
<propertyname="allowedPass">
<list>
<value>login.do</value>
<!-- <value>add.do</value> -->
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
|
JSP
|
<body>
<formaction="login.do"method="post">
用户名:<inputname="name"type="text"/><br>
密码:<inputname="pwd"type="password"/><br>
<inputtype="submit"value="submit"/>
</form>
</body>
|
实体类
|
publicclass
User {
privateint
id;
privateString
name;
privateString
pwd;
//下面省略get、set方法
|