1.登录

登录实现如下步骤:

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

html代码如下:

 <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<a href="/login/login">登录</a>
</body>
</html>

2.控制层实现

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

  /**
* 获取登录页面
* @param req
* @return
*/
@RequestMapping("/login")
public String login(HttpServletRequest req){
//创建登录token随机数
String loginToken = UUID.randomUUID().toString();
HttpSession session = req.getSession();
//后端的钥匙
session.setAttribute("LOGIN_TOKEN_IN_SESSION",loginToken);
//前端放放钥匙
req.setAttribute("loginToken",loginToken);
return "/WEB-INF/views/login.jsp";
}

3.登录页面效果

登录页面html代码

  <body>
<div align="center">
<%-- 存放token信息--%>
<input id="loginToken" type="hidden" value="${loginToken}"><br/>
用户名:<input id="userName" type="text" value=""/>
<br/>
密 &nbsp; 码:<input id="password" type="password" value=""/>
<br/>
<button onclick="login()">登录</button>
</div>
</body>

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

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

  function login(){
//1.获取参数
var userName = $("#userName").val();
var password = $("#password").val();
//登录token信息
var loginToken = $("#loginToken").val();
//2.发送请求
var params = {
userName:userName,
password:password,
_loginToken:loginToken
};
var url = 'http://localhost:8080/login/checkLogin';
jQuery.ajax({
type: 'POST',
contentType: 'application/x-www-form-urlencoded',
url: url,
data: params,
dataType: 'json',
success: function (data) {
//需要的数据 是否成功 失败原因 code 成功的话 0000 失败0001
var code = data.code;
if (code=='0000'){
//登录成功 跳转到购票页面
window.location.href="http://localhost:8080/ticket2/page";
}else {
//登录失败
var msg = data.msg;//登录失败原因
alert("登录失败:"+msg)
}
},
error: function (data) {
alert("失败啦");
}
});
}

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

  /**
* 登录检查
* @return
*/
@RequestMapping("/checkLogin")
@ResponseBody
public Result checkLogin(HttpServletRequest req,LoginUser loginUser,String _loginToken){
Result<Object> objectResult = new Result<>();
//检查是否重复提交
HttpSession session = req.getSession();
//后端的钥匙
String loginToken = (String)session.getAttribute("LOGIN_TOKEN_IN_SESSION");
if (loginToken==null){
System.out.println("------手贱-------");
objectResult.setCode("0001");
return objectResult;
// System.exit(0);//千万不要写这个
}else if (!loginToken.equals(_loginToken)){
System.out.println("------手贱-------");
//System.exit(0);//千万不要写这个
objectResult.setCode("0001");
return objectResult;
}
//删除 token
session.removeAttribute("LOGIN_TOKEN_IN_SESSION");
System.out.println("----第一次登录----------");
try {
Thread.sleep(1000);//用于测试重复提交演示
} catch (InterruptedException e) {
e.printStackTrace();
}
//调用业务方法检测登录
Boolean aBoolean = loginUserService.checkLogin(loginUser);
if (aBoolean){
//登录成功 信息放session
session.setAttribute("LOGIN_IN_SESSION",loginUser);
objectResult.setCode("0000");
}else {
//登录失败
objectResult.setCode("0001");
objectResult.setMsg("用户名或密码错误");
}
objectResult.setSuccess(aBoolean);
return objectResult;
}

6.业务层处理登录检查

  @Override
public Boolean checkLogin(LoginUser loginUser) {
String userName = loginUser.getUserName();
String password1 = loginUser.getPassword();
//1.根据用户名查询该用户是否存在
LoginUser loginUserByName = loginUserDao.getLoginUserByName(userName);
//2.如果用户存在
if (loginUserByName!=null){
// 检查密码是否正确
String password = loginUserByName.getPassword();
if (password.equals(password1)){
//密码正确 登录成功
return true;
}
}
//登录失败
return false;
}

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
  @Test
public void testGetList(){
LoginUser loginUser = loginUserDao.getLoginUserByName("wuji");
System.out.println("loginUser="+loginUser);
}

到此登录完成

2.拦截器配置

2.1编写拦截器类 LoginInterceptor.java

 package com.day02.sation.filter;

 import com.day02.sation.model.LoginUser;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; /**
* Created by Administrator on 12/29.
*/
public class LoginInterceptor extends HandlerInterceptorAdapter { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("-------preHandle----");
//判断是否有登录信息
HttpSession session = request.getSession();
LoginUser loginUser = (LoginUser) session.getAttribute("LOGIN_IN_SESSION");
if (loginUser==null){
System.out.println("-------没有登录----");
//没有登录跳转到登录页面
response.sendRedirect("/login/login");
}else {
System.out.println("-------已经登录----");
}
return true;
}
}

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

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:interceptors>
<!--登录拦截器配置-->
<mvc:interceptor>
<!-- 拦截所有-->
<mvc:mapping path="/**"/>
<!-- 排除静态资源-->
<mvc:exclude-mapping path="/static/*"/>
<!--排除登录相关-->
<mvc:exclude-mapping path="/login/*"/>
<!-- 处理类-->
<bean class="com.day02.sation.filter.LoginInterceptor"/>
</mvc:interceptor>
<!-- 其他拦截器-->
</mvc:interceptors>
</beans>

2.3读取拦截器文件

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

3.注销

3.1注销按钮

<button onclick="loginout()">注销</button>

3.2执行js函数

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

3.3控制层处理代码

 /**
* 注销
* @param req
* @return
*/
@RequestMapping("/loginout")
public String loginout(HttpServletRequest req){
HttpSession session = req.getSession();
//删除登录信息
session.removeAttribute("LOGIN_IN_SESSION");
//注销后跳转到首页
return "/index.jsp";
}

到此注销完成!

大型运输行业实战_day05_1_登录+注销+表单重复提交+登录拦截器的更多相关文章

  1. 1.struts 防止表单重复提交 2. 拦截器

    1. 使用struts 防止表单提交 时, form 表单必须使用struts标签库编写,如<s:form/> 等,而不是html标签 2. 拦截器是struts2的核心.  interc ...

  2. JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码

    1. 自动登录 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表单重复提交 表单Servlet //负责产生表单 pub ...

  3. 由防止表单重复提交引发的一系列问题--servletRequest的复制、body值的获取

    @Time:2019年1月4日 16:19:19 @Author:QGuo   背景:最开始打算写个防止表单重复提交的拦截器:网上见到一种不错的方式,比较合适前后端分离,校验在后台实现: 我在此基础上 ...

  4. struts2之防止表单重复提交

    struts.xml配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  5. struts2的防止表单重复提交

    防止表单重复提交其实就是struts2的一个拦截器的使用: struts.xml配置文件: <?xml version="1.0" encoding="UTF-8& ...

  6. 大型运输行业实战_day11_2_事务理论与实际生产配置事务管理

    1.什么是事务(Transaction:tx) 数据库的某些需要分步完成,看做是一个整体(独立的工作单元),不能分割,要么整体成功,要么整体生效.“一荣俱荣,一损俱损”,最能体现事务的思想.案例:银行 ...

  7. PHP生成token防止表单重复提交

    .提交按钮置disabled 当用户提交后,立即把按钮置为不可用状态.这种用js来实现. 提交前代码如下: $()  {  $exec="insert into student (user_ ...

  8. 毕业设计——Django表单重复提交问题

    1. 先记录一些正常情况:在填写表单页面(如注册.登录页面)时刷新页面时数据清空是正常的,此时就是重新发送了一个页面请求. 2. 问题一:用户登录后,刷新登陆后的页面(如首页)时会出现表单重复提交问题 ...

  9. Struts1防止表单重复提交

    package org.zln.struts.action; import org.apache.struts.action.Action; import org.apache.struts.acti ...

随机推荐

  1. 安装Linux软件时没有图形界面的问题

    Q: 现在Linux下的软件有很多也采用图形界面安装了:但有时候我们发现启动安装程序时本该出现图形界面时却出现了文本界面. A: 检查常用的图形函数库(最主要的自然是gtk, qt)是否已安装.尤其是 ...

  2. webpack创建library及从零开始发布一个npm包

    最近公司有个需求,我们部门开发一个平台项目之后,其他兄弟部门开发出的插件我们可以拿来直接用,并且不需要我们再进行打包,只是做静态的文件引入,研究一波后发现,webpack创建library可以实现. ...

  3. mysql分区表之一:分区原理和优缺点【转】

    1.分区表的原理 分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分 ...

  4. 关于pandas里面的合并

    from pandas import * from numpy import * import json from pylab import * left = DataFrame({'key1':[' ...

  5. shell 6基本运算符

    shell支持多种运算符: * 算数运算符 * 关系运算符 * 布尔运算符 * 字符串运算符 * 文件测试运算符 算数运算符 + 加 `expr $a + $b` 结果为 30 - 减 `expr $ ...

  6. 利用.pbk来实现ADSL开机自动拨号

    当你新建拨号连接或者VPN连接之后在你的电脑里会创建一个.pbk的文件 这个.pbk的文件可以说是一个集合,将你电脑的所有连接都保存在一起. 同时你还可以将此连接复制起来传给其他人. 系统默认的.pb ...

  7. 【POJ】2480 Longge's problem(欧拉函数)

    题目 传送门:QWQ 分析 题意就是求∑gcd(i, N) 1<=i <=N.. 显然$ gcd(i,n) = x $时,必然$x|n$. 所以我们枚举一下n的约数,对于每个约数x,显然$ ...

  8. 半联结&反联结!

    半联结是在两个数据集(表)之间的联结,其中第一个数据集中的数据行在决定是否返回时会根据在另一个数据集中出现或不出现至少一个相匹配的数据行来确定.“不出先”匹配行——这是半联结的一种特殊形式,称为反联结 ...

  9. laravel 5.3 ——路由(资源,别名)

    laravel的路由定义中,其中route:resoure(),可以直接定义类似restful风格的URL 例如:Route::resource('system/role','System\RoleC ...

  10. Python:23种Pandas核心操作

    Pandas 是一个 Python 软件库,它提供了大量能使我们快速便捷地处理数据的函数和方法.一般而言,Pandas 是使 Python 成为强大而高效的数据分析环境的重要因素之一.在本文中,作者从 ...