springmvc,springboot拦截器的配置
springmvc拦截器的配置
首先继承HandlerInterceptorAdapter ,重写preHandle方法.preHandle在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制等处理,实现对是否登录进行拦截。
-
preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回false 表示中断后续操作。
-
postHandle
方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。 -
afterCompletion
方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 1.获取session对象
HttpSession session = request.getSession();
// 2.尝试从session获取admin对象
Admin admin = (Admin)session.getAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN);
// 3.判断admin对象是否存在
if (admin == null) {
throw new AccessForbiddenException(CrowdConstant.MESSAGE_ACCESS_FORBIDEN);
}
// 4.不为空放行
return true;
}
}
在springmvc的配置文件里进行拦截器的注册。
需要值得注意的是:<mvc:interceptor> 元素的子元素必须按照 <mvc:mapping…/>、<mvc:exclude-mapping…/>、<bean…/> 的顺序配置。
<!-- 注册拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- mvc:mapping配置要拦截的资源 -->
<!-- /*对应一层路径,比如:/aaa -->
<!-- /**对应多层路径,比如:/aaa/bbb或/aaa/bbb/ccc或/aaa/bbb/ccc/ddd -->
<mvc:mapping path="/**"/>
<!-- mvc:exclude-mapping配置不拦截的资源访问的路径 -->
<mvc:exclude-mapping path="/admin/to/login/page.html"/>
<mvc:exclude-mapping path="/admin/do/login.html"/>
<mvc:exclude-mapping path="/admin/do/logout.html"/>
<!-- 配置拦截器类 -->
<bean class="com.atguigu.crowd.mvc.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
在springboot中配置验证是否登录拦截器
首先写一个拦截器类实现HandlerInterceptor 接口
public class UserLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = (User)request.getSession().getAttribute(MallConst.CURRENT_USER);
if (user == null){
throw new UserLoginExceprion();
}
return true;
}
}
再写一个配置类(@Configuration)实现WebMvcConfigurer 接口
@Configuration
public class InterceptionConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) { // 注册拦截器
registry.addInterceptor(new UserLoginInterceptor())
.addPathPatterns("/**") // 需要拦截的资源
.excludePathPatterns("/user/login", // 不拦截的资源
"/user/register", "/category/selectAll",
"/products", "/products/*");
}
}