本人新手,不足之处,请谅解。 有不足之处,欢迎提出。
下面开始给大家介绍具体的实现:
先说下具体用到的几个类:
1.在这里先给大家说下Session的主要内容( 检查session登陆的信息,判断是否是首页登陆,(是则通过,不是跳转登陆页面)判断是否是ajax的请求,是则直接放行)
HandlerInterceptor :SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理
preHandle:方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用。
postHandle:postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操作。
afterCompletion:调用前提:preHandle返回true,调用时间DispatcherServlet进行视图的渲染之后
下面我来贴出具体代码
package com.example.admins.system;
import com.example.admins.Bean.UserBean_a;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @describe Session拦截器
*/
public class SessionInterceptor implements HandlerInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(SessionInterceptor.class);
/**
* 检查session中的登录信息,区别ajax
*/
@Override //获取请求 和发送请求到服务器中 定义类的名称
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取类的名称 赋值给requestURI 参数 进行相关的调用
String requestURI = request.getRequestURI();
//在控制台输出 获取到的所有的相关的路径
LOGGER.info("Session 检查,请求 URI:" + requestURI);
// 再次获取参数赋值给uri的问题
String uri = request.getRequestURI();
//判断非空
if (uri != null) {
//todo 判断是否的登陆的首页 登陆则通过
//String类型有一个方法:contains(),该方法是判断字符串中是否有子字符串。如果有则返回true,如果没有则返回false。 page/login是我的登陆页面
if (uri.contains("/page/login")) {// 登录请求直接放行 对于某些不需要验证的uri可以特殊处理
return true;
}
//todo 判断是否已经登录 此处的("user") 是登陆中获取的,判断是否登陆
UserBean_a member = (UserBean_a) request.getSession().getAttribute("user");
if (member == null) {
if (isAjax(request)) {
LOGGER.info("是ajax请求");
//指定格式防止乱码
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Content-Type", "text/json;charset=utf-8");
response.setCharacterEncoding("UTF-8");
} else {
//重定向页面 如果没有登录就跳转到登录页面 page/login是我的登陆页面
response.sendRedirect(request.getContextPath() + "/page/login");
//停止 运行
return false;
}
}
}
//继续 运行
return true;
}
/**
* 处理成功才进入post处理
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//LOGGER.info(">>>>>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
}
/**
* 处理完后进入,不论是否抛除异常
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//LOGGER.info(">>>>>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
/**
* @param request
* @return
* @describe 判断是否是ajax请求
*/
private boolean isAjax(HttpServletRequest request) {
String xrw = request.getHeader("X-Requested-With");
if ("XMLHttpRequest".equalsIgnoreCase(xrw)) {
return true;
}
return false;
}
}
2.下面我来给大家介绍,拦截器的主要类
这个类的位置也很关键,请大家注意,这是我遇到的坑
代码贴上:
package com.example.admins;
import com.example.admins.system.SessionInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
//放在主类上不包括其他东西
//WebMvcConfigurerAdapter这个类,重写这个类中的方法可以让我们增加额外的配置
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
//addResourceLocations指的是文件放置的目录
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");
}
//addResoureHandler指的是对外暴露的访问路径 此处一般默认即可
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 静态资源拦截器
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
我说下我在这个类中遇到的坑:excludePathPatterns("/static/**"); 是放行本类中的一些css/js 等样式,大家在此处应该注意下: 1.是不是所有的样式在static中 2.直接贴图,
确认页面的样式是不是从static 中进去 如果不是他可能会把你的样式进行拦截。此处是本人的坑,希望大家注意;
3.最后我来说下:登陆中对此类的应该 控制台的登陆代码
贴代码:
此处的 User 是我们在第一条 登陆判断的时候的 User ,他从控制台获取登陆的数据,来判断你是否登陆
登录成功之后将用户信息保存到session里
session.setAttribute(“user”, userBean1);
//登陆
@RequestMapping(value = "/index")
@ResponseBody
public String lo(UserBean_a userBean, HttpSession session) {
System.out.println("------------控制台前端输入的获取的账号输入的" + userBean.getUsername());
UserBean_a userBean1 = userService.userLogin(userBean);
System.out.println("------------userBean1的账号" +userBean1);
if (userBean1 != null) {
System.out.println(userBean1);
log.debug("用户登陆成功--{}", JSONObject.toJSONString(userBean1));
// 登录成功之后将用户信息保存到session里
session.setAttribute("user", userBean1);
/* System.out.println(md5Pass);*/
return userBean1.toString();
}
log.debug("用户登陆失败--{}", JSONObject.toJSONString(userBean1));
return null;
}
这样就完成了登陆拦截请求。
一个新手、没背景的野鸡大学挣脱出来的野小子,主要以不断
学习,不断记录,用思维认知去看这个世界。写作、阅读、分享,用独自的思考和感悟分享给互联网里的每一位技术人。
不爱学习的我们,无力的挣扎吧!