大型运输行业实战_day05_1_登录+注销+表单重复提交+登录拦截器

news/2024/7/24 8:02:42

1.登录

   登录实现如下步骤:

  1.在首页中添加登录按钮

  

   html代码如下:

 

1 <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
2 <html>
3   <head>
4     <title>首页</title>
5   </head>
6   <body>
7    <a href="/login/login">登录</a>
8   </body>
9 </html>

 

 2.控制层实现

   注意:为了防止表单重复提交 必须设定token值,进行表单重复提交校验

 1  /**
 2      * 获取登录页面
 3      * @param req
 4      * @return
 5      */
 6     @RequestMapping("/login")
 7     public String login(HttpServletRequest req){
 8         //创建登录token随机数
 9         String loginToken = UUID.randomUUID().toString();
10         HttpSession session = req.getSession();
11         //后端的钥匙
12         session.setAttribute("LOGIN_TOKEN_IN_SESSION",loginToken);
13         //前端放放钥匙
14         req.setAttribute("loginToken",loginToken);
15         return "/WEB-INF/views/login.jsp";
16     }

 

3.登录页面效果

 

   登录页面html代码

 1  <body>
 2   <div align="center">
 3      <%-- 存放token信息--%>
 4       <input id="loginToken" type="hidden" value="${loginToken}"><br/>
 5     用户名:<input id="userName" type="text" value=""/>
 6     <br/>
 7&nbsp; 码:<input id="password" type="password" value=""/>
 8     <br/>
 9     <button onclick="login()">登录</button>
10   </div>
11   </body>

 

4.点击登录按钮执行的js函数

   注意js函数必须携带登录token值,便于检查是否为重复提交

 1  function login(){
 2        //1.获取参数
 3       var userName = $("#userName").val();
 4        var password = $("#password").val();
 5          //登录token信息
 6          var loginToken = $("#loginToken").val();
 7        //2.发送请求
 8        var params = {
 9          userName:userName,
10          password:password,
11            _loginToken:loginToken
12        };
13        var url = 'http://localhost:8080/login/checkLogin';
14        jQuery.ajax({
15          type: 'POST',
16          contentType: 'application/x-www-form-urlencoded',
17          url: url,
18          data: params,
19          dataType: 'json',
20          success: function (data) {
21            //需要的数据  是否成功   失败原因   code  成功的话 0000  失败0001
22             var code = data.code;
23              if (code=='0000'){
24                  //登录成功  跳转到购票页面
25                  window.location.href="http://localhost:8080/ticket2/page";
26              }else {
27                  //登录失败
28                 var msg =  data.msg;//登录失败原因
29                  alert("登录失败:"+msg)
30              }
31          },
32          error: function (data) {
33            alert("失败啦");
34          }
35        });
36      }

 

 5.处理登录检查的控制层

 1  /**
 2      * 登录检查
 3      * @return
 4      */
 5     @RequestMapping("/checkLogin")
 6     @ResponseBody
 7     public Result checkLogin(HttpServletRequest req,LoginUser loginUser,String _loginToken){
 8         Result<Object> objectResult = new Result<>();
 9         //检查是否重复提交
10         HttpSession session = req.getSession();
11         //后端的钥匙
12         String loginToken = (String)session.getAttribute("LOGIN_TOKEN_IN_SESSION");
13        if (loginToken==null){
14            System.out.println("------手贱-------");
15            objectResult.setCode("0001");
16            return objectResult;
17           // System.exit(0);//千万不要写这个
18        }else if (!loginToken.equals(_loginToken)){
19            System.out.println("------手贱-------");
20            //System.exit(0);//千万不要写这个
21            objectResult.setCode("0001");
22            return objectResult;
23        }
24         //删除 token
25         session.removeAttribute("LOGIN_TOKEN_IN_SESSION");
26         System.out.println("----第一次登录----------");
27         try {
28             Thread.sleep(1000);//用于测试重复提交演示
29         } catch (InterruptedException e) {
30             e.printStackTrace();
31         }
32         //调用业务方法检测登录
33         Boolean aBoolean = loginUserService.checkLogin(loginUser);
34         if (aBoolean){
35             //登录成功 信息放session
36             session.setAttribute("LOGIN_IN_SESSION",loginUser);
37             objectResult.setCode("0000");
38         }else {
39             //登录失败
40             objectResult.setCode("0001");
41             objectResult.setMsg("用户名或密码错误");
42         }
43         objectResult.setSuccess(aBoolean);
44         return objectResult;
45     }

 

 6.业务层处理登录检查

 1  @Override
 2     public Boolean checkLogin(LoginUser loginUser) {
 3         String userName = loginUser.getUserName();
 4         String password1 = loginUser.getPassword();
 5         //1.根据用户名查询该用户是否存在
 6         LoginUser loginUserByName = loginUserDao.getLoginUserByName(userName);
 7         //2.如果用户存在
 8         if (loginUserByName!=null){
 9             // 检查密码是否正确
10             String password = loginUserByName.getPassword();
11              if (password.equals(password1)){
12                  //密码正确 登录成功
13                  return true;
14              }
15         }
16         //登录失败
17         return false;
18     }

 

7.持久层

  接口:

LoginUser getLoginUserByName(String userName);

 mapper映射文件:

<select id="getLoginUserByName" parameterType="string" resultType="com.day02.sation.model.LoginUser">
SELECT l.id, l.user_name userName, l.`password` FROM login_user AS l WHERE user_name=#{userName}
</select>
8.测试dao
1  @Test
2     public void testGetList(){
3         LoginUser loginUser = loginUserDao.getLoginUserByName("wuji");
4         System.out.println("loginUser="+loginUser);
5     }
 
 

 

到此登录完成

2.拦截器配置

     2.1编写拦截器类 LoginInterceptor.java

 1 package com.day02.sation.filter;
 2 
 3 import com.day02.sation.model.LoginUser;
 4 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import javax.servlet.http.HttpSession;
 9 
10 /**
11  * Created by Administrator on 12/29.
12  */
13 public class LoginInterceptor extends HandlerInterceptorAdapter {
14 
15     @Override
16     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
17         System.out.println("-------preHandle----");
18            //判断是否有登录信息
19         HttpSession session = request.getSession();
20         LoginUser loginUser = (LoginUser) session.getAttribute("LOGIN_IN_SESSION");
21         if (loginUser==null){
22             System.out.println("-------没有登录----");
23             //没有登录跳转到登录页面
24             response.sendRedirect("/login/login");
25         }else {
26             System.out.println("-------已经登录----");
27         }
28         return true;
29     }
30 }

 

2.2配置mapper/spring/spring-loginInterceptor.xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:mvc="http://www.springframework.org/schema/mvc"
 4        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd
 7          http://www.springframework.org/schema/mvc
 8         http://www.springframework.org/schema/mvc/spring-mvc.xsd">
 9     <mvc:interceptors>
10         <!--登录拦截器配置-->
11         <mvc:interceptor>
12             <!-- 拦截所有-->
13             <mvc:mapping path="/**"/>
14             <!--  排除静态资源-->
15             <mvc:exclude-mapping path="/static/*"/>
16             <!--排除登录相关-->
17             <mvc:exclude-mapping path="/login/*"/>
18            <!-- 处理类-->
19             <bean class="com.day02.sation.filter.LoginInterceptor"/>
20         </mvc:interceptor>
21         <!-- 其他拦截器-->
22     </mvc:interceptors>
23 </beans>

 

2.3读取拦截器文件

到此登录拦截器配置完成!

3.注销

     3.1注销按钮

      <button οnclick="loginout()">注销</button>

     3.2执行js函数

1    function loginout(){
2        //进入注销处理控制层
3         window.location.href="http://localhost:8080/login/loginout";
4     }

 

   3.3控制层处理代码

 1 /**
 2      * 注销
 3      * @param req
 4      * @return
 5      */
 6     @RequestMapping("/loginout")
 7     public String loginout(HttpServletRequest req){
 8         HttpSession session = req.getSession();
 9         //删除登录信息
10         session.removeAttribute("LOGIN_IN_SESSION");
11         //注销后跳转到首页
12         return "/index.jsp";
13     }

 到此注销完成!

转载于:https://www.cnblogs.com/newAndHui/p/8145679.html


http://www.niftyadmin.cn/n/799314.html

相关文章

python子域名收集器

今天心血来潮做了一个子域名收集器。过程是蛋疼啊&#xff01;这里先感谢一下qpython群的咸鱼大佬&#xff0c;在换页的时候出了点毛病&#xff0c;讲到后面我们就知道了。 思路&#xff1a; 代码开始: 我们要用到的模块是 Requests Bs4模块里的BeautifulSoup Time模块 如果Bea…

小散量化炒股记|手把手教你转换通达信公式,盘整后均线粘合突破

前言通达信的公式编写功能非常流行&#xff0c;很多高手都是在通达信上编写公式来分析股票的。作为过来人&#xff0c;建议大家在初期的策略研究阶段&#xff0c;选一个通用的平台进行策略研究&#xff0c;因为有现成的功能模块可以调用&#xff0c;这样就能把精力聚焦在设计策…

冲刺第二周第二天

任务板 站立会议 燃尽图 转载于:https://www.cnblogs.com/wangyisong/p/8161656.html

选出底部均线粘合,长阳突破的牛股!股票量化分析工具QTYX-V2.5.0

前言大牛股在上涨初期往往会有一些特征信号&#xff0c;根据这些特点过滤出可能成为牛股的标的&#xff0c;然后重点跟踪它们&#xff0c;这无疑是非常有效的选股方式。我们来看下欢瑞世纪这只票上涨初期的特征。股价在区间内上下波动&#xff0c;20日、30日、60日、120日均线逐…

C++ shut down a computer

前阵子有朋友问我&#xff0c;怎么用C语言写一个小程序&#xff0c;控制电脑关机。这个我真的不懂&#xff0c;这几天闲着&#xff0c;就上网搜了搜&#xff0c;整理一下。 IDE: Code::Blocks 16.01 操作系统&#xff1a;Windows 7 x64 1 #include <windows.h>2 3 int ma…

QTYX量化系统实战案例分享|双底形态叠加业绩报表选股之202209

前言 我突然觉得非常有必要和大家分享一些QTYX在实战中的应用案例&#xff08;包括失败的案例&#xff09;&#xff0c;这样能够帮助大家更好地去理解QTYX中的功能设计&#xff0c;也能更好地帮助大家搭建出属于自己的量化交易系统。 首先要声明几点&#xff1a; QTYX量化系统推…

mysql 备份恢复

备份/恢复数据库: D:\wamp\bin\mysql\mysql5.6.12\bin\mysqldump -hlocalhost -uroot -proot db > d:/db.sql D:\wamp\bin\mysql\mysql5.6.12\bin\mysql -hlocalhost -uroot -proot db --default-character-setutf8 < d:/db.sql备份/恢复单表: D:\wamp\bin\mysql\mysql5.…

spark安装_「大数据」(七十三)Spark之开发环境配置

【导读&#xff1a;数据是二十一世纪的石油&#xff0c;蕴含巨大价值&#xff0c;这是情报通大数据技术系列第[73]篇文章&#xff0c;欢迎阅读和收藏】1 基本概念无论 Windows 或 Linux 操作系统&#xff0c;构建 Spark 开发环境的思路一致&#xff0c;基于 Eclipse 或 Idea &a…