前言
在项目中检查是否登录有几种方式,今天介绍使用注解方式+拦截器配合使用。
实现
第一步:创建注解。
package com.study.it.entity.annotation;
import java.lang.annotation.*;
//写到哪里
@Target({ElementType.TYPE,ElementType.METHOD}) //表示注解的作用对象,ElementType.TYPE表示类,ElementType.METHOD表示方法
//什么时候起作用
@Retention(RetentionPolicy.RUNTIME) //表示注解的保留机制,RetentionPolicy.RUNTIME表示运行时注解
@Inherited //表示该注解可继承
@Documented //表示该注解可生成文档
public @interface Login {
}
第二步:创建拦截器。
package com.study.it.ui.interceptor;
import com.bdqn.it.entity.annotation.Login;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 登录拦截器
*/
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object o) throws Exception {
// 从会话中取当前登录对象
if (req.getSession().getAttribute("user") != null){
// 已登录就放行
return true;
}
HandlerMethod hm = (HandlerMethod)o;
// 检查被请求方法头是否有注解 ----> @Login
if (hm.getMethodAnnotation(Login.class) == null){
// 没有注解就放行
return true;
}
// req.getContextPath()动态获取工程路径
// 没登录的话就重定向去登录
resp.sendRedirect(req.getContextPath() + "/login");
return false;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
第三步:到spring MVC注册拦截器。
<!--拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.study.it.ui.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>