大型运输行业实战_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 ...
随机推荐
- dedeampz安装wordpress程序,然后新增数据库方法
看到一篇文章,用dedeampz安装wordpress程序,增加新的数据库的. 安装方法很简单,就是把..\DedeAMPZ\WebRoot\Default 下面的dede的代码 可以给移走放到别的地 ...
- 无需公众号PHP微信登录微信授权微信第三方登录微信开发php开发
无论是个人还是公司,无需申请公众号,无需申请微信开放平台,即可实现手机网站和PC网站的微 信登录!!! 正常的微信登录是这样的: 1.手机版网站做微信登录,需要申请一个认证公众号,认证不仅需要公司营 ...
- jenkins 定时构建 位置
定时器构建语法 * * * * * 星号中间用空格隔开 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三个*表示一个月的第几天,取值1~31 第四个*表示第几月,取值1~12 第五 ...
- 阿里云EC2+QEMU虚拟机+ROS完全教程!
---恢复内容开始--- 1.安装centos6.5 x64 同时记录,当前centos分配得到的IP,子网掩码,网关,以及MAC!!! 查看IP.mac命令ip add 查看网关命令cat /etc ...
- centos 7.5 安装mongodb
MongoDB安装和启动 从官网下载最新对应的版本然后解压,本文以3.6.9为例,将文件拷贝到opt目录下,然后解压: [root@localhost opt]# tar zxvf mongodb-l ...
- JedisCluster中应用的Apache Commons Pool对象池技术
对象池技术在服务器开发上应用广泛.在各种对象池的实现中,尤其以数据库的连接池最为明显,可以说是每个服务器必须实现的部分. apache common pool 官方文档可以参考:https://c ...
- pip安装包(python安装gevent(win))
下载: https://www.lfd.uci.edu/~gohlke/pythonlibs/#greenlet greenlet greenlet-0.4.14-cp36-cp36m-win_amd ...
- python动态函数hasattr,getattr,setattr,delattr
hasattr(object,name) hasattr用来判断对象中是否有name属性或者name方法,如果有,染回true,否则返回false class attr(): def fun( ...
- HTML 标签元素的 align 属性
align 属性规定段落中文本的对齐方式. 有 left right center justify 这些参数 left right center 就是左对齐 右对齐 中间对齐 justify ...
- jquery 隐藏 显示 动画效果
<!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js&qu ...