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. dedeampz安装wordpress程序,然后新增数据库方法

    看到一篇文章,用dedeampz安装wordpress程序,增加新的数据库的. 安装方法很简单,就是把..\DedeAMPZ\WebRoot\Default 下面的dede的代码 可以给移走放到别的地 ...

  2. 无需公众号PHP微信登录微信授权微信第三方登录微信开发php开发

    无论是个人还是公司,无需申请公众号,无需申请微信开放平台,即可实现手机网站和PC网站的微 信登录!!! 正常的微信登录是这样的: 1.手机版网站做微信登录,需要申请一个认证公众号,认证不仅需要公司营 ...

  3. jenkins 定时构建 位置

    定时器构建语法 * * * * * 星号中间用空格隔开 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三个*表示一个月的第几天,取值1~31 第四个*表示第几月,取值1~12 第五 ...

  4. 阿里云EC2+QEMU虚拟机+ROS完全教程!

    ---恢复内容开始--- 1.安装centos6.5 x64 同时记录,当前centos分配得到的IP,子网掩码,网关,以及MAC!!! 查看IP.mac命令ip add 查看网关命令cat /etc ...

  5. centos 7.5 安装mongodb

    MongoDB安装和启动 从官网下载最新对应的版本然后解压,本文以3.6.9为例,将文件拷贝到opt目录下,然后解压: [root@localhost opt]# tar zxvf mongodb-l ...

  6. JedisCluster中应用的Apache Commons Pool对象池技术

    对象池技术在服务器开发上应用广泛.在各种对象池的实现中,尤其以数据库的连接池最为明显,可以说是每个服务器必须实现的部分.   apache common pool 官方文档可以参考:https://c ...

  7. pip安装包(python安装gevent(win))

    下载: https://www.lfd.uci.edu/~gohlke/pythonlibs/#greenlet greenlet greenlet-0.4.14-cp36-cp36m-win_amd ...

  8. python动态函数hasattr,getattr,setattr,delattr

    hasattr(object,name) hasattr用来判断对象中是否有name属性或者name方法,如果有,染回true,否则返回false class attr():     def fun( ...

  9. HTML 标签元素的 align 属性

    align 属性规定段落中文本的对齐方式. 有 left  right center  justify 这些参数 left  right center  就是左对齐 右对齐 中间对齐 justify  ...

  10. jquery 隐藏 显示 动画效果

    <!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js&qu ...