目录
一、实现思路
在 SpringMVC 或者 SSM 环境的项目下,新建一个拦截类,继承 HandlerInterceptor 接口,然后实现接口里面的三个方法,接着在 preHandle 方法里面编写拦截后的相关处理,然后在 springmvc 的配置中,将所有访问 controller 的链接给全都拦截下来就行。
注意:springmvc 配置拦截后,可能会把静态资源给拦截掉,这时候只需要把静态资源设置为不拦截就行,具体实现看下面。
二、具体实现
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求的URL
String url = request.getRequestURI();
//URL:除了登录请求外,其他的URL都进行拦截控制
if( url.indexOf("/login") >= 0 ){
return true;
}
//获取 Session
HttpSession session =request.getSession();
TAdmin tadmin = (TAdmin)session.getAttribute("user");
//判断Session中是否有用户数据,如果有,则返回true,继续想下执行
if( tadmin != null ){
return true;
}
//不符合条件的给出提示信息,并转发到登录页面
request.getRequestDispatcher("/jsp/login/login.jsp").forward(request,response);
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
在 springmvc 的配置中添加下面的代码:
<!-- 5.配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/checkCode" />
<mvc:exclude-mapping path="/getcookie" />
<mvc:exclude-mapping path="/loginout" />
<!-- 对静态资源不采取拦截 -->
<mvc:exclude-mapping path="/**/*.js" />
<mvc:exclude-mapping path="/**/*.css" />
<mvc:exclude-mapping path="/**/*.png" />
<mvc:exclude-mapping path="/**/*.gif" />
<mvc:exclude-mapping path="/**/*.jpg" />
<mvc:exclude-mapping path="/**/*.jpeg" />
<mvc:exclude-mapping path="/**/iconfont.*" />
<bean class="com.yyzheng.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<mvc:mapping path="/**" />:拦截所有访问 controller 的路径
<mvc:exclude-mapping path="/loginout" />:对不需要拦截的路径进行释放处理
bean :是指向到上面的 Java 类(LoginInterceptor)
至于静态资源的处理,根据自己项目所用到相关资源再进行修改。
三、HandlerInterceptorAdapter
下面是另外一种写,继承的是 HandlerInterceptor 接口的实现类。配置的话是一样。
public class ShopLoginInterceptor extends HandlerInterceptorAdapter {
/**
* 主要做事前拦截,即用户操作发生前,改写 preHandle 里的逻辑,进行拦截
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//从session中取出用户信息
Object userObj = request.getSession().getAttribute("user");
if (userObj != null) {
//若用户信息不为空,则将session里的用户信息转换成PersonInfo
PersonInfo user = (PersonInfo) userObj;
//做控制判断,确保userId不为空,并且该账号的可用状态为1,并且用户类型为店家
if (user != null && user.getUserId() != null && user.getUserId() > 0 && user.getEnableStatus() == 1)
//若通过验证则返回true,拦截器返回true之后,用户接下来的操作得以正常执行
return true;
}
//若不满足登录验证,则直接跳转到账号登录页面
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<script>");
out.println("window.open ('" + request.getContextPath() + "/local/login?usertype=2','_self')");
out.println("</script>");
out.println("</html>");
return false;
}
}