业务逻辑:后端mvc拦截器拦截所有的*.html和*.app请求(controller的后缀,用于识别controller,也可以换成其它如:userLogin.action),检查登录状态如果未登录则跳转到登录页。(顺便说一下login是登录而不是登陆)

  1. web.xml 配置 DispatcherServlet 前端控制器的url-pattern为*.app和*.html。如下所示。
    <!--配置springmvc DispatcherServlet(前端控制器)--><servlet><servlet-name>SpringMVCDispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><!--配置dispatcher.xml作为mvc的配置文件--><param-name>contextConfigLocation</param-name><param-value>classpath:dispatcher-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>SpringMVCDispatcher</servlet-name><!--url-pattern的配置,所有.app和.html请求都将被Spring MVC的DispatcherServlet截获。--><url-pattern>*.app</url-pattern><url-pattern>*.html</url-pattern></servlet-mapping>
  1. 写你的拦截器类,或如下所示
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取请求的URLString url = request.getRequestURI();// URL:除了登录请求和转发页面请求,其它的请求URL都进行拦截控制if (url.indexOf("/userLogin.app") >= 0) {return true;}else if(url.indexOf("/forword.jsp") >= 0){return true;} else if(url.indexOf("/login.html") >= 0) {return true;}// 获取SessionHttpSession session = request.getSession();//获取session中的用户登录数据User user = (User) session.getAttribute("User");// 判断Session中是否有用户登录数据,如果有,则返回true,继续向下执行if (user != null) {return true;}// 不符合条件的给出提示信息,并转发到登录页面String redirecturl = request.getContextPath() + "/login.html";response.sendRedirect(redirecturl);return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}
}
  1. 配置springmvc核心配置文件: <mvc:default-servlet-handler />不配这个启动项目直接404,还有拦截器的<mvc:mapping path="/**" />,注意path。配置如下所示。
<!--Spring MVC 在全局配置文件中提供了一个<mvc:default-servlet-handler/>标签。在 WEB 容器启动的时候会在上下文中定义一个 DefaultServletHttpRequestHandler,它会对DispatcherServlet的请求进行处理,如果该请求已经作了映射,那么会接着交给后台对应的处理程序,如果没有作映射,就交给 WEB 应用服务器默认的 Servlet 处理,从而找到对应的静态资源,只有再找不到资源时才会报错。--><mvc:default-servlet-handler />
<!-- 配置拦截器 --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**" /><bean class="com.*.interceptor.LoginInterceptor" />//这里写你的拦截器类</mvc:interceptor></mvc:interceptors>
  1. 在你的Controller返回的数据中,如果登录成功加上需要跳转的URL,登录失败提示登录失败。如下所示

为什么不用后端来跳转? 因为返回数据就不能返回页面,详见:https://blog.csdn.net/wa_junye/article/details/113866907

//BindingResult和Valid用作jsr303校验,可不加。responseMessage为自定义响应消息类,用于响应自定义的json数据
public ResponseMessage userLoginByUsernameAndPassword(@RequestBody @Valid User user,BindingResult bindingResult) throws IOException {//jsr303校验错误返回jsonif(bindingResult.hasErrors()) {Map<String,Object> map = new HashMap<String,Object>();List<FieldError> errors = bindingResult.getFieldErrors();for(FieldError fieldError : errors) {map.put(fieldError.getField(),fieldError.getDefaultMessage());}responseMessage.setCode("800");responseMessage.setTimestamp(System.currentTimeMillis());return responseMessage.add("errorFields",map);}this.user = userLoginService.selectUserByUsernameAndPwd(user.getUsername(),user.getPassword());if(this.user != null) {session.setAttribute("User",this.user);responseMessage.setCode("200");responseMessage.setMsg("登录成功");responseMessage.setTimestamp(System.currentTimeMillis());responseMessage.add("url","/staticSource/user/html/datacenter.html");return responseMessage;}responseMessage.setCode("100");responseMessage.setMsg("登陆失败,请检查用户名或密码是否有误");responseMessage.setTimestamp(System.currentTimeMillis());return responseMessage;}
  1. 前端判断是否登录成功,如果是则跳转。前端跳转还是会被拦截器拦截,但是已经将登录成功的数据放入了session,拦截器判断已登录就可以访问跳转页面。
//发送登录请求并处理响应结果,注意代码中的switchloginXhr = new MyXhr({"options":{"method":"post","url":getRealPath() + "/user/userLogin.app","data":data},"success":function(data){data = JSON.parse(data);switch (data.code) {case "100": loginMessageEle.innerHTML = data.msg; break;case "200": {loginMessageEle.innerHTML = data.msg;window.location = getRealPath() + data.data.url;} break;case "800": loginMessageEle.innerHTML = data.msg; break;}return false;},"error":function(){loginMessageEle.innerText = "请求失败";}});

如果还是可以访问需要登录的页面,请将你的浏览器缓存关闭,或者换一个浏览器来访问。

Springmvc拦截所有html和Controller,实现未登录则返回登录页,已登录则可以访问需要登录的页面。相关推荐

  1. SpringMVC拦截器2(资源和权限管理)(作为补充说明)

    SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServle ...

  2. springMVC 拦截器

    为什么80%的码农都做不了架构师?>>>    实现springMVC 拦截器步骤: 1.定义拦截器类××××HandlerInterceptor  继承HandlerInterce ...

  3. springmvc 拦截器、国际化、验证

    2019独角兽企业重金招聘Python工程师标准>>> springmvc 拦截器 继承了HandlerIntercepter的类可以作为拦截器类: package com.yawn ...

  4. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  5. SpringMVC拦截器HandlerInterceptor原理及使用

    在使用SpringMVC拦截器的时候,我们接触的最多的便是HandlerInterceptor接口,因为我们所有的自定义拦截器都必须要实现HandlerInterceptor接口,那么就先从Handl ...

  6. Java Servlet 过滤器与 springmvc 拦截器的区别?

    前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...

  7. 在拦截器里放入参数 controller_干货|SpringMVC拦截器的使用详解

    一.拦截器简介 Spring MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信 ...

  8. 跨域请求/SpringMVC拦截器

    <!-- 开启允许跨域 --> <mvc:cors> <mvc:mapping path="/**"/> </mvc:cors> S ...

  9. 439、Java框架93 -【SpringMVC - 拦截器】 2020.12.14

    目录 0.效果 1.拦截器类:IndexInterceptor 2.配置拦截器 3.修改 index.jsp 4.测试 5.参考链接 0.效果 访问地址之后,看到如图所示的拦截器打印的效果 http: ...

最新文章

  1. visual studio code 调试ROS的插件
  2. Jquery Easy UI Datagrid 上下移动批量保存数据
  3. Hibernate总结1
  4. 关于CefSharp的坎坷之路
  5. Chrome Console Cookie 控制台操作命令
  6. linux安装mysql5.7.18_Linux下安装mysql5.7.18版本步骤
  7. springboot使用mybatis_使用springboot+mybatis数据库存储服务化
  8. 第二百九十四节,Redis缓存-Redis安装
  9. js最简单的几个特效_腊八蒜最简单做法,掌握这几个诀窍快速变绿,又脆又香,真过瘾...
  10. 转:OGRE场景管理器介绍
  11. 【NOIP2005】【Luogu1052】过河
  12. asp.net oracle连接数据库,通过ASP.NET连接Oracle数据库实例教程
  13. 训练集与测试集数据分布不一致
  14. Pytorch极简入门教程(十六)——预训练网络ResNet101微调
  15. HDOJ-1060-Leftmost Digit(求n^n的最高位)
  16. 面试官:说说left join和left semi join 两者有什么区别?
  17. 袭扰战术_战术十必不可少的八
  18. 高性能MySQL -- 查询性能优化
  19. 【转载】html转义字符
  20. 2018年大连民族大学全国计算机,走进高校:大连民族大学(附2019各省录取线)...

热门文章

  1. clr20r3 mysql.data_C# CLR20R3 程序终止的几种解决方案
  2. python-OpenCV图像的基本运算
  3. 她的癌细胞救了上亿条命,却很少有人知道她的名字
  4. ubuntu下gvim启动出现gtk warning Invalid input string
  5. Mac插件分享——AE插件、PS插件、FCPX插件【持续更新中】
  6. 如何使Xcode占用更少的空间 Xcode占用空间太大解决方法
  7. FCPX插件mTransition Shade for mac(71组阴影遮挡过渡视频转场)
  8. 2.2 基本算法之递归和自调用函数 1751 分解因数 python
  9. java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)
  10. 面向对象程序设计要考虑的7个原则