一、通过实现HandlerInterceptor接口来定义拦截器
1、通过实现HandlerInterceptor接口来定义拦截器:
public class MyInterceptor implements HandlerInterceptor{
// 处理请求方法前先执行该方法,如果返回false则不执行后续的拦截器
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("处理前" + request.getRequestURI());
return true;
}
// 处理请求方法执行后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("处理后");
}
// 在DispatcherServlet执行后执行,主要做一些清理工作。。。Springmvc的对象是单例的
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("最最后");
}
}
2、定义Springmvc文件
不要忘记添加:
xmlns:mvc="http://www.springframework.org/schema/mvc"在配置文件头
<!--拦截器的配置 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- /**指的是该路径及其子路径 如果配合admin/* ,则拦截不了admin/user/add,想要拦截则配置admin/** -->
<mvc:mapping path="/**" />
<bean class="winney.controller.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
如果被拦截了,可以在prepreHandle通过ServletAPI进行转发或者重定向。
二、实现登录拦截
1、添加登录界面:
<form method="post" action="/hello2/logon.do">
姓名:<input type="text" name="uname"><br> 密码:<input
type="password" name="pwd"> <br> <input type="submit"
vaslue="submit">
</form>
2、实现登录处理器:
@Controller
public class LoginController {
@RequestMapping("/logon")
public String login(User user, HttpSession session) {
if ("winney".equals(user.getUname()) && "1234".equals(user.getPwd())) {
session.setAttribute("user", user);
return "/index";
}
return "/login";
}
}
3、实现拦截器
这里在拦截器里面添加一个allowPass属性,用于设置哪些url是可以直接通过,不拦截的。
private List<String> allowPass;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String url = request.getRequestURL().toString();
Object user = request.getSession().getAttribute("user");
if (user != null) {
return true;
}
for (String temp : allowPass) {
if (url.endsWith(temp)) {
return true;
}
}
request.getRequestDispatcher("/login.jsp").forward(request, response);
return false;
}
4、在配置文件里面配置拦截器
注意:这里给拦截器里面的allowPass属性注入了初始值。所以在allowPass是必须生成getter和setter方法的。
<mvc:interceptor>
<!-- /**指的是该路径及其子路径 如果配合admin/* ,则拦截不了admin/user/add,想要拦截则配置admin/** -->
<mvc:mapping path="/**" />
<bean class="winney.controller.LoginInterceptor">
<property name="allowPass">
<list>
<value>/logon.do</value>
</list>
</property>
</bean>
</mvc:interceptor>