首先
登陆成功后存入 session
一、SpringMVC
1、创建 登陆拦截类 AuthFilter 继承 Filter, 重写 doFilter 方法。
package com.web.util;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class AuthFilter implements Filter {
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
/**
* 1,doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括
* 表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过
* 滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。
*/
HttpServletRequest request = (HttpServletRequest) servletRequest;
/**
* 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中
* 无法得到的方法,就要把此request对象构造成HttpServletRequest
*/
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession(false);
String currentURL = request.getRequestURI(); // 取得根目录所对应的绝对路径:
//String targetURL = "";
//if (currentURL!=null) {
// targetURL = currentURL.substring(currentURL.indexOf("/", 1), currentURL.length()); // 截取到当前文件名用于比较
//}
// 排除登陆页面, 登陆不需要拦截、判断session
int index = -1;
index = currentURL.indexOf("/login.html");
if (index == -1) {
// 判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环
if (session == null || session.getAttribute("user") == null) {
response.sendRedirect(request.getContextPath() + "/login.html");
//response.sendRedirect("parent.window.location.reload()");
// 如果session为空表示用户没有登录就重定向到login.html页面
return;
}
}
// 加入filter链继续向下执行
filterChain.doFilter(request, response);
/**
* 调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作 为它
* 的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另
* 一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
*/
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
2、注入, 在web.xml中配置拦截类
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.web.util.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/run</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/frameset</url-pattern>
</filter-mapping>
二、SpringBoot中的登陆拦截
1、创建 LoginHandlerInterceptor 继承 HandlerInterceptor , 重写里面 preHandle方法。
package com.appms.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取session中 用户信息
HttpSession session = request.getSession();
// 是否登陆页面
String currentURL = request.getRequestURI(); // 取得根目录所对应的绝对路径:
// int mainPageIndex = -1;
// mainPageIndex = currentURL.indexOf("/main.html");
// 判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环
if (null == session || null == session.getAttribute("user")) {
response.sendRedirect(request.getContextPath() + "/index.html");
return false;
}
return true;
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
}
/**
* 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
}
}
2、 创建 WebConfig 继承 WebMvcConfigurer, 重写 addInterceptors 方法。
package com.appms.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**") //拦截的请求
.excludePathPatterns("/index.html", "/user/login", "/main/**"); // 不需要拦截的请求
}
}
说明:
不管是接口请求,还是页面请求,除了登陆页面 index.html/login.htm 、登陆接口 /uer/login,其它的请求(接口、静态页面、资源css、.gif、img等)的都需要验证session。这样就做到了拦截的目的。
------------------------------------------------------分割线---------------------------------
博客只作为博主记录、复习用。对你有用或参考的话,请自行完善,有任何不足或引发的事故概不负责。