大型运输行业实战_day05_1_登录+注销+表单重复提交+登录拦截器
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/>
密 码:<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.struts 防止表单重复提交 2. 拦截器
1. 使用struts 防止表单提交 时, form 表单必须使用struts标签库编写,如<s:form/> 等,而不是html标签 2. 拦截器是struts2的核心. interc ...
- JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码
1. 自动登录 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表单重复提交 表单Servlet //负责产生表单 pub ...
- 由防止表单重复提交引发的一系列问题--servletRequest的复制、body值的获取
@Time:2019年1月4日 16:19:19 @Author:QGuo 背景:最开始打算写个防止表单重复提交的拦截器:网上见到一种不错的方式,比较合适前后端分离,校验在后台实现: 我在此基础上 ...
- struts2之防止表单重复提交
struts.xml配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...
- struts2的防止表单重复提交
防止表单重复提交其实就是struts2的一个拦截器的使用: struts.xml配置文件: <?xml version="1.0" encoding="UTF-8& ...
- 大型运输行业实战_day11_2_事务理论与实际生产配置事务管理
1.什么是事务(Transaction:tx) 数据库的某些需要分步完成,看做是一个整体(独立的工作单元),不能分割,要么整体成功,要么整体生效.“一荣俱荣,一损俱损”,最能体现事务的思想.案例:银行 ...
- PHP生成token防止表单重复提交
.提交按钮置disabled 当用户提交后,立即把按钮置为不可用状态.这种用js来实现. 提交前代码如下: $() { $exec="insert into student (user_ ...
- 毕业设计——Django表单重复提交问题
1. 先记录一些正常情况:在填写表单页面(如注册.登录页面)时刷新页面时数据清空是正常的,此时就是重新发送了一个页面请求. 2. 问题一:用户登录后,刷新登陆后的页面(如首页)时会出现表单重复提交问题 ...
- Struts1防止表单重复提交
package org.zln.struts.action; import org.apache.struts.action.Action; import org.apache.struts.acti ...
随机推荐
- android 自定义radiogroup的两种方式
这里先备注下 listview+radiobutton实现 浅显易懂 http://www.haolizi.net/example/view_3312.html 在radiogoup原生态源码的基础 ...
- Mybatis学习(2)原始dao开发和使用mapper接口代理开发
基础知识: 1).SqlSessionFactoryBuilder: 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory.将SqlSessionFact ...
- java web程序 html标签中<th>和<td>的用法区别:
<th>是用于表头式的 <td>是列 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional ...
- Valgrind memcheck 8种错误实例
调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1. 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2 2. 解压安装包:tar –jxvf ...
- class<T>和 class<?>类型 有什么区别
平时看java源代码的时候,如果碰到泛型的话,我想? T K V E这些是经常出现的,但是有时想不起来代表什么意思,今天整理下: ? 表示不确定的java类型. T 表示java类型. K V 分别代 ...
- MySQL 误删用户
误删除root用户&误删除所有用户 #----------------------------------------------------------------------------- ...
- [UE4]Pawn和Controller,第一人称和第三人称切换
一. Pawn 可以被控制的Actor,可以被Controller持有控制,并且从Controller中接受输入.例如:玩家.NPC(Not Player Character) 二.Controlle ...
- [UE4]组件
用来组成Actor的子对象,Actor是由组件组成的. 几个关键的Component类型: 一.UActorComponent 这个Component的基类,可以被放到Actor里面, 可以接受Tic ...
- [UE4]roll pitch yaw
UE4中的定义: 一.Roll,绕着X轴旋转的角度 二.Pitch,绕着Y轴旋转的角度 三.Yaw,绕着Z轴旋转的角度 Rotator 一.(Roll,Pitch,Yaw) 二.Rotator(0,0 ...
- Web 项目遇到的乱码问题
问题代码: jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...