本人新手,不足之处,请谅解。 有不足之处,欢迎提出。
下面开始给大家介绍具体的实现:
先说下具体用到的几个类:
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; }
这样就完成了登陆拦截请求。
一个新手、没背景的野鸡大学挣脱出来的野小子,主要以不断
学习,不断记录,用思维认知去看这个世界。写作、阅读、分享,用独自的思考和感悟分享给互联网里的每一位技术人。
不爱学习的我们,无力的挣扎吧!