拦截器的作用在于,比如我们输入 xxx.com/admin 发起请求进入 网站后台或者其他后台页面。我们的拦截器会在 Controller  调用之前进行拦截,至于什么拦截,由我们来写。比如,判断用户是否登录(可以通过 session 判断),如果没有登录,我们让它跳转到登录页面。

转载 https://liuyanzhao.com/6300.html

一、拦截器的基本使用

1、新建一个 拦截器

SecurityInterceptor.java

  1. package com.liuyanzhao.blog.Interceptor;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class SecurityInterceptor implements HandlerInterceptor {
  7. @Override
  8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
  9. System.out.println("SecurityInterceptor...preHandle...");
  10. //这里可以根据session的用户来判断角色的权限,根据权限来转发不同的页面
  11. if(request.getSession().getAttribute("userId") == null) {
  12. request.getRequestDispatcher("/login").forward(request,response);
  13. return false;
  14. }
  15. return true;
  16. }
  17. @Override
  18. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  19. }
  20. @Override
  21. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  22. }
  23. }

判断是否有 userId 这个session,如果没有(或者过期了)转发到登录页面

2、配置 springmvc.xml

通过使用 mvc:interceptors 标签来声明需要加入到SpringMVC拦截器链中的拦截器。

  1. <mvc:interceptors>
  2. <mvc:interceptor>
  3. <mvc:mapping path="/admin"/>
  4. <bean class="com.liuyanzhao.blog.Interceptor.SecurityInterceptor"/>
  5. </mvc:interceptor>
  6. <mvc:interceptor>
  7. <mvc:mapping path="/admin/**"/>
  8. <bean class="com.liuyanzhao.blog.Interceptor.SecurityInterceptor"/>
  9. </mvc:interceptor>
  10. </mvc:interceptors>

只需两步,我们已经能成功拦截  /admin 和其其前缀的如 /admin/article 等其他所有路径啦。

二、登录实现

登录主要是验证该用户是否存在,密码是否正确。然后添加 session 和页面跳转

1、登录表单

login.jsp

  1. <%
  2. String username = "";
  3. String password = "";
  4. //获取当前站点的所有Cookie
  5. Cookie[] cookies = request.getCookies();
  6. for (int i = 0; i < cookies.length; i++) {//对cookies中的数据进行遍历,找到用户名、密码的数据
  7. if ("username".equals(cookies[i].getName())) {
  8. username = cookies[i].getValue();
  9. } else if ("password".equals(cookies[i].getName())) {
  10. password = cookies[i].getValue();
  11. }
  12. }
  13. %>
  14. <form name="loginForm" id="loginForm"  method="post">
  15. <input type="text" name="username" id="user_login"
  16. class="input" value="<%=username%>" size="20" required/></label>
  17. <input type="password" name="password" id="user_pass"
  18. class="input" value="<%=password%>" size="20" required/>
  19. <input name="rememberme" type="checkbox" id="rememberme" value="1" /> 记住密码
  20. <input type="button" name="wp-submit" id="submit-btn" class="button button-primary button-large" value="登录" />
  21. </form>

为了代码简洁,这里去掉了多余的标签和属性。我这里是扒了 wordpress 的登录页面,这里也用到了 cookie 。

注意:这里的 form 表单里没有 action 属性,最终发送数据通过 ajax 。同样,也没有 submit 按钮,为了防止 ajax+form+submit 导致 success 里无法页面跳转。

2、js 代码

  1. <%--登录验证--%>
  2. $("#submit-btn").click(function () {
  3. var user = $("#user_login").val();
  4. var password = $("#user_pass").val();
  5. if(user=="") {
  6. alert("用户名不可为空!");
  7. } else if(password==""){
  8. alert("密码不可为空!");
  9. } else {
  10. $.ajax({
  11. async: false,//同步,待请求完毕后再执行后面的代码
  12. type: "POST",
  13. url: '${pageContext.request.contextPath}/loginVerify',
  14. contentType: "application/x-www-form-urlencoded; charset=utf-8",
  15. data: $("#loginForm").serialize(),
  16. dataType: "json",
  17. success: function (data) {
  18. if(data.code==0) {
  19. alert(data.msg);
  20. } else {
  21. window.location.href="${pageContext.request.contextPath}/admin";
  22. }
  23. },
  24. error: function () {
  25. alert("数据获取失败")
  26. }
  27. })
  28. }
  29. })

这里 ajax 使用同步,防止出现后台没有返回值,就执行了后面的js代码,进而出现 ajax 执行 error:function() 里的代码。数据类型使用 json,当然也可以使用 text,只不过 text 只能 返回普通的字符串。

最后,如果验证通过,将跳转到 xxx.com/admin 页面(当然后台需要加入session,否则拦截器会拦截)。

3、控制器代码

  1. //登录页面显示
  2. @RequestMapping("/login")
  3. public ModelAndView loginView() {
  4. ModelAndView modelAndView = new ModelAndView();
  5. modelAndView.setViewName("/Admin/login");
  6. return modelAndView;
  7. }
  8. //登录验证
  9. @RequestMapping(value = "/loginVerify",method = RequestMethod.POST)
  10. @ResponseBody
  11. public String loginVerify(HttpServletRequest request, HttpServletResponse response) throws Exception {
  12. Map<String, Object> map = new HashMap<String, Object>();
  13. String username = request.getParameter("username");
  14. String password = request.getParameter("password");
  15. String rememberme = request.getParameter("rememberme");
  16. UserCustom userCustom = userService.getUserByNameOrEmail(username);
  17. if(userCustom==null) {
  18. map.put("code",0);
  19. map.put("msg","用户名无效!");
  20. } else if(!userCustom.getUserPass().equals(password)) {
  21. map.put("code",0);
  22. map.put("msg","密码错误!");
  23. } else {
  24. //登录成功
  25. map.put("code",1);
  26. map.put("msg","");
  27. //添加session
  28. request.getSession().setAttribute("user", userCustom);
  29. //添加cookie
  30. if(rememberme!=null) {
  31. //创建两个Cookie对象
  32. Cookie nameCookie = new Cookie("username", username);
  33. //设置Cookie的有效期为3天
  34. nameCookie.setMaxAge(60 * 60 * 24 * 3);
  35. Cookie pwdCookie = new Cookie("password", password);
  36. pwdCookie.setMaxAge(60 * 60 * 24 * 3);
  37. response.addCookie(nameCookie);
  38. response.addCookie(pwdCookie);
  39. }
  40. }
  41. String result = new JSONObject(map).toString();
  42. return result;
  43. }

这里登录验证方法内,getUserByNameOrEmail() 方法用来从数据库里查找是否有该用户(用户名或者邮箱)。如果有,而且密码正确,添加一条 session,要和拦截器里写的一致哦。并将信息添加到 Map 中,然后转成 JSON 数据,这里需要导入 对应JSON 的jar 哦。

  1. <dependency>
  2. <groupId>org.json</groupId>
  3. <artifactId>json</artifactId>
  4. <version>20170516</version>
  5. </dependency>

4、Service 和 DAO

这里就不贴 Service 和 Dao 的代码了,主要就是根据 字符串查找用户的操作啦。

三、注销实现

注销就比较简单了,清除 session 就行了。

1、jsp 页面

  1. <a href="${pageContext.request.contextPath}/admin/logout">退了</a>

2、控制器代码

  1. //退出登录
  2. @RequestMapping(value = "/admin/logout")
  3. public String logout(HttpSession session) throws Exception {
  4. session.removeAttribute("userId");
  5. session.invalidate();
  6. return "redirect:/login";
  7. }

SSM 拦截器验证权限和登录与注销的实现的更多相关文章

  1. SSM博客实战(9)-拦截器验证权限和登录与注销的实现

    转载 https://liuyanzhao.com/6300.html

  2. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  3. Struts2使用拦截器完成权限控制示例

    http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求:    要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...

  4. Java结合SpringBoot拦截器实现简单的登录认证模块

    Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...

  5. struts2拦截器-简单实现非法登录验证

    概念:什么是拦截器 拦截器实现了面向切面的组件,它会影响多个业务对象的公共行为封装到一个个可重用的模块,减少了系统的重复代码,实现高度内聚,确保业务对象的整洁!   为什么使用拦截器 拦截器消除了动作 ...

  6. springmvc拦截器验证登录时间

    在前一篇[Filter实现用户名验证]的随笔里,记录了如何使用filter 这次增加了拦截器实现 ①filter实现用户登陆时验证用户名是否为null ②interceptor实现用户登陆时时间判断, ...

  7. Struts2(十四)拦截器实现权限管理

    一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...

  8. 6、Struts2拦截器实现权限控制

    1.创建如下项目结果 2.在com.entity包下创建 package com.entity; public class User { private String name; private St ...

  9. SSM拦截器应用

    1.创建工具包 2.编写拦截器业务逻辑类容(在此为验证登录效果) @Override public void doFilter(ServletRequest req, ServletResponse ...

随机推荐

  1. Pytorch基础(6)----参数初始化

    一.使用Numpy初始化:[直接对Tensor操作] 对Sequential模型的参数进行修改: import numpy as np import torch from torch import n ...

  2. win10家庭版转专业版并激活

    之前重装win10的时候没注意,不小心装成家庭版. 本以为家庭版也没什么,后来发现这对程序员来说造成致命打击. 在系统信息页面底部点击“更改密匙”,输入win10升级产品密匙:VK7JG-NPHTM- ...

  3. 布尔类型、操作符别名、C++函数、动态内存分配(new\delete)、引用(day02)

    六 C++的布尔类型 bool类型是C++中基本类型,专门表示逻辑值:true/false bool在内存上占一个字节:1表示true,0表示false bool类型可以接收任意类型和表达式的结果,其 ...

  4. Linux下进程与线程的区别

    https://www.cnblogs.com/fah936861121/articles/8043187.html https://my.oschina.net/cnyinlinux/blog/36 ...

  5. SpringBoot快速创建HelloWorld项目

    废话不多提,拿起键盘,打开 IDEA 就是一通骚操作. 打开 IDEA 后,首页选择 Create New Project,再接着按下图所示,快速搭建SpringBoot项目. 接下来将 Group ...

  6. 编码的由来,ASCII编码,和字节的形成

    一.编码的由来 计算机只能计算和识别二进制,必须让计算机识别文字,才能和计算机进行交互,彼此也才能通过计算机通信. 由此,有了ASCII编码的诞生,它起始于50年代后期,在1967年定案,是最初美国国 ...

  7. MySQL 复制 - 性能与扩展性的基石:概述及其原理

    原文:MySQL 复制 - 性能与扩展性的基石:概述及其原理 1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他 ...

  8. 修改oracle数据库时间

    1.修改前需要先停止 oracle 数据库服务 2.修改 oracle 数据库所在的服务器时间 3.再次启动 oracle 数据库,即可 以上就是小编修改 oracle 数据库的时间,修改完之后,其他 ...

  9. netty心跳机制和断线重连(四)

    心跳是为了保证客户端和服务端的通信可用.因为各种原因客户端和服务端不能及时响应和接收信息.比如网络断开,停电 或者是客户端/服务端 高负载. 所以每隔一段时间 客户端发送心跳包到客户端  服务端做出心 ...

  10. 【ACM】hdu_1092_A+BIV_201307261630

    A+B for Input-Output Practice (IV)Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3276 ...