大型运输行业实战_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 ...
随机推荐
- 解决eclipse中断点调试不起作用的问题
解决eclipse中断点调试不起作用的问题 eclipsegeneration编译器file工作 最近几天,遇到了一个问题,就是在eclipse中进行断点调试程序到时候,跟踪不到我设置的断点.困惑 ...
- SpringCloud负载均衡笔记
SpringCloud的负载均衡组件用的是Ribbon,这个东西就是服务消费者.它只是一个配置用的中转器,放在 Zuul 和 Eureka Client 之间用来转发的,它里面写了好多规则,用来指定负 ...
- Number常用方法函数
Number类型应该是ECMAScript中最令人关注的数据类型了,这种类型使用IEEE754来表示整数和浮点数,并针对Number相关特点定义了一系列相关的方法函数. isFinite() 在Jav ...
- gc之六--Minor GC、Major GC、Full GC以及Mixed GC之间的区别
目录: GC之一--GC 的算法分析.垃圾收集器.内存分配策略介绍 GC之二--GC日志分析(jdk1.8)整理中 GC之三--GC 触发Full GC执行的情况及应对策略 gc之四--Minor G ...
- POJ 2139 Six Degrees of Cowvin Bacon (floyd)
Six Degrees of Cowvin Bacon Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Ja ...
- Missing Number @leetcode
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...
- 批处理-通过mono把c#编译成dll
::copyright@cjy @echo off ::mcs.exe address set addrMcs=D:\Program Files\Unity\Editor\Data\MonoBleed ...
- How to Use vcpkg On Windows
Introduction If you do any sort of C++ development on Windows, then you know that library/package ma ...
- Solr优化案例分析
随着umc接入主机的数量越来越多,每天产生的syslog日志数量也在剧增, 之前一天产生的syslog数量才不 到1W,随着整个集团的网络设备不端接入,导致现在每天产生的syslog数量大概在180w ...
- Docker-compose 在up之后,各个子服务容器的hosts文件中不能找到父服务的域名
使用命令查看docker当前建立的网络: docker network ls 发现docker-compose up确实建立了网络xx_default 使用命令查看该网络详细信息: docker in ...