发表于: 2017-10-05 20:32:19
1 767
一、今日完成
1.学习Spring MVC拦截器的使用
在Spring MVC中定义一个Interceptor拦截器通常在要定义的拦截器类中实现HandlerInterceptor接口或者继承抽象类HandlerInterceptorAdapter。
HandlerInterceptor接口中定义了三个方法:
1)boolean preHandle (HttpServletRequest request, HttpServletResponse response, Obiect handler),该方法在请求处理前被调用。返回flase时,表示请求结束,后续的interceptor和Controller都不会再执行;当返回true时继续执行下一个interceptor和Controller。
2)void postHandle(HttpServletRequest request, HttpServletResponse response,Obiect handler, ModelAndView mv);该方法在当前请求被处理之后即Controller方法调用后执行,在DispatcherServlet进行视图返回渲染之前被调用。
3)void afterCompletion(HttpServletRequest request, HttpServletResponse response,Obiect handler, Exception exception);该方法在整个请求结束后执行,主要作用是进行资源清理。
2.设计拦截器验证用户是否登录,如果没有登录,不可以访问除登录页面和登录所有的Controller
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.fkit.domain.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 拦截器必须实现HandlerInterceptor接口
* */
public class AuthorizationInterceptor implements HandlerInterceptor {
// 不拦截"/loginForm"和"/login"请求
private static final String[] IGNORE_URI = {"/loginForm", "/login"};
/**
* 该方法将在整个请求完成之后执行, 主要作用是用于清理资源的,
* 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception)
throws Exception {
System.out.println("AuthorizationInterceptor afterCompletion --> ");
}
/**
* 该方法将在Controller的方法调用之后执行, 方法中可以对ModelAndView进行操作 ,
* 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView mv) throws Exception {
System.out.println("AuthorizationInterceptor postHandle --> ");
}
/**
* preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,
* 该方法的返回值为true拦截器才会继续往下执行,该方法的返回值为false的时候整个请求就结束了。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("AuthorizationInterceptor preHandle --> ");
// flag变量用于判断用户是否登录,默认为false
boolean flag = false;
//获取请求的路径进行判断
String servletPath = request.getServletPath();
// 判断请求是否需要拦截
for (String s : IGNORE_URI) {
if (servletPath.contains(s)) {
flag = true;
break;
}
}
// 拦截请求
if (!flag){
// 1.获取session中的用户
User user = (User) request.getSession().getAttribute("user");
// 2.判断用户是否已经登录
if(user == null){
// 如果用户没有登录,则设置提示信息,跳转到登录页面
System.out.println("AuthorizationInterceptor拦截请求:");
request.setAttribute("message", "请先登录再访问网站");
request.getRequestDispatcher("loginForm").forward(request, response);
}else{
// 如果用户已经登录,则验证通过,放行
System.out.println("AuthorizationInterceptor放行请求:");
flag = true;
}
}
return flag;
}
}
在pringmvc-config.xml中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<bean class="org.fkit.interceptor.AuthorizationInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2.今天感冒加重,晚上回家较早休息,所以学习内容较少。
二、明日计划
继续任务4,计划在10月8日提交。
三、遇到问题
暂无。
四、收获
以上。
评论