ios或安卓登入java后台token校验机制简介

30 篇文章 0 订阅

ios或者安卓在登入的时候为了统一校验,一般的的情况下会到一个共同的接口进行检验,这里用java做了一个简单的后台接口用于ios或者安卓登入校验。后台的java框架是SSM框架。

下边是校验的流程:


使用的maven,以下是pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.demo</groupId>
  <artifactId>login-mobile</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
  
  		<!-- spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>

		<!-- json处理 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.7.5</version>
		</dependency>

		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.3.0</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.2</version>
		</dependency>

		<!-- pagehelper -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
			<version>4.1.6</version>
		</dependency>
		<dependency>
			<groupId>com.github.jsqlparser</groupId>
			<artifactId>jsqlparser</artifactId>
			<version>0.9.5</version>
		</dependency>

		<!-- Mapper -->
		<dependency>
			<groupId>com.github.abel533</groupId>
			<artifactId>mapper</artifactId>
			<version>2.3.4</version>
		</dependency>

		<!-- ldap -->
		<dependency>
			<groupId>org.springframework.ldap</groupId>
			<artifactId>spring-ldap-core</artifactId>
			<version>2.1.0.RELEASE</version>
		</dependency>

		<!-- 日志 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.12</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.12</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>

		<!-- jsp -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>
		
		<!-- 数据库 -->
<!-- 		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
		</dependency> -->
		<!-- 连接池 -->
<!-- 		<dependency>
			<groupId>com.jolbox</groupId>
			<artifactId>bonecp-spring</artifactId>
		</dependency> -->
		
        <!-- 导入Mysql数据库链接jar包 -->  
        <dependency>  
            <groupId>mysql</groupId>  
            <artifactId>mysql-connector-java</artifactId>  
            <version>5.1.30</version>  
        </dependency>  
		<dependency>
		    <groupId>c3p0</groupId>
		    <artifactId>c3p0</artifactId>
		    <version>0.9.1.2</version>
		</dependency>	
		        	
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.4</version>
		</dependency>
		
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>
		
  </dependencies>
</project>

web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<display-name>login</display-name>

	<context-param>
		<param-name>webAppRootKey</param-name>
		<param-value>login</param-value>
	</context-param>

	<!-- 加载log4j的配置文件 -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:properties/log4j.properties</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<!-- 加载spring相关配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/applicationContext*.xml</param-value>
	</context-param>
	<!-- spring applicationContext载入 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 编码过滤器,以UTF8编码 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- 配置springMVC -->
	<servlet>
		<servlet-name>login</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/springMVC-servlet.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>login</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- welcome file -->
	<welcome-file-list>
		<welcome-file>login.jsp</welcome-file>
	</welcome-file-list>
	
</web-app>


实体类user.java:

package com.demo.login.pojo;

public class User {

	//id	
	private Long id;
	
	//user_id	
	private String userId;
	
	private String passWord;
	
	//token
	private String token;
	
	//device_id	
	private String deviceId;
	
	//msg_uid
	private String msgUid;
	
	//version
	private String version;
	
	//token_date
	private String tokenDate;
	
	//os_type
	private String osType;

	public String getOsType() {
		return osType;
	}

	public void setOsType(String osType) {
		this.osType = osType;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getToken() {
		return token;
	}

	public void setToken(String token) {
		this.token = token;
	}

	public String getDeviceId() {
		return deviceId;
	}

	public void setDeviceId(String deviceId) {
		this.deviceId = deviceId;
	}

	public String getMsgUid() {
		return msgUid;
	}

	public void setMsgUid(String msgUid) {
		this.msgUid = msgUid;
	}

	public String getVersion() {
		return version;
	}

	public void setVersion(String version) {
		this.version = version;
	}

	public String getTokenDate() {
		return tokenDate;
	}

	public void setTokenDate(String tokenDate) {
		this.tokenDate = tokenDate;
	}

	public String getPassWord() {
		return passWord;
	}

	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", userId=" + userId + ", token=" + token + ", deviceId=" + deviceId + ", msgUid="
				+ msgUid + ", version=" + version + ", tokenDate=" + tokenDate + ", osType=" + osType + "]";
	}

}


controller类:

package com.demo.login.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.demo.login.pojo.User;
import com.demo.login.service.LoginService;

@RestController
@RequestMapping(value="login")
public class LoginController {

	@Autowired
	public LoginService loginService;
	
	@RequestMapping(method = RequestMethod.POST)
	@ResponseBody
	public Map<String, Object> login(User user){
		
		Map<String, Object> map = new HashMap<String, Object>();
		
		try {
			map = loginService.login(user);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return map;
	}
}
service层的实现类:

package com.demo.service.login.impl;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.demo.login.mapper.LoginMapper;
import com.demo.login.pojo.User;
import com.demo.login.service.LoginService;
import com.demo.login.util.CodeStatus;
import com.demo.login.util.SystemStatus;
import com.demo.login.util.UUIDUtil;

@Service
public class LoginServiceImpl implements LoginService {

	@Autowired
	public LoginMapper loginMapper;
	
	@Override
	public Map<String, Object> login(User user) throws Exception {
		
		//登入校验返回的数据
		Map<String, Object> map = new HashMap<String, Object>();
		
		//校验数据
		if (user != null) {
			
			if (StringUtils.isBlank(user.getDeviceId())) {
				
				map.put("code", CodeStatus.FAIL);
				map.put("status", SystemStatus.SUCCESS);
				map.put("data", "");
				map.put("msg", "deviceId字段不能为空");
				return map;
			}
			
			if (StringUtils.isBlank(user.getMsgUid())) {
				
				map.put("code", CodeStatus.FAIL);
				map.put("status", SystemStatus.SUCCESS);
				map.put("data", "");
				map.put("msg", "msgUid字段不能为空");
				return map;
			}
			
			if (StringUtils.isBlank(user.getVersion())) {
				
				map.put("code", CodeStatus.FAIL);
				map.put("status", SystemStatus.SUCCESS);
				map.put("data", "");
				map.put("msg", "version字段不能为空");
				return map;
				
			}
			
			if (StringUtils.isBlank(user.getOsType())) {
				
				map.put("code", CodeStatus.FAIL);
				map.put("status", SystemStatus.SUCCESS);
				map.put("data", "");
				map.put("msg", "osType字段不能为空");
				return map;
				
			}
			
		}else{
			return map;
		}
		
		//1.1token登入
		int tokenCount = loginMapper.validateByToken(user);
		
		if (tokenCount == 1) {
			
			//若token校验成功,则登入成功
			map.put("code", CodeStatus.SUCCESS);
			map.put("status", SystemStatus.SUCCESS);
			//TODO 这里data可以获取登入返回的数据,比如权限数据等
			map.put("data", "this login by token");
			map.put("msg", "token校验成功");
			return map;
		}else{//1.2账号和密码登入
			
			//1.2.1校验,可以用其他的方式校验,比如ldap
			int userIdCount = 0;
			if (StringUtils.isNoneBlank(user.getPassWord()) && StringUtils.isNoneBlank(user.getUserId())) {
				
				userIdCount = loginMapper.login(user);
			}else{
				
				map.put("code", CodeStatus.FAIL);
				map.put("status", SystemStatus.SUCCESS);
				map.put("data", "");
				map.put("msg", "用户名密码字段不能为空");
				return map;
			}
			
			if (userIdCount == 1) {//校验成功
				
				//token表中插入或更新数据
				user.setToken(UUIDUtil.getUuid());
				loginMapper.insertOrUpdate(user);
				
				map.put("code", CodeStatus.SUCCESS);
				map.put("status", SystemStatus.SUCCESS);
				//TODO 这里data可以获取登入返回的数据,比如权限数据等
				map.put("data", "this login by token");
				map.put("msg", "账号和密码校验成功");
				return map;
			}else{
				
				map.put("code", CodeStatus.FAIL);
				map.put("status", SystemStatus.SUCCESS);
				//TODO 这里data可以获取登入返回的数据,比如权限数据等
				map.put("data", "this login by userId and password");
				map.put("msg", "账号或密码校验失败");
				return map;
			}
		}
		
	}

}


mapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.login.mapper.LoginMapper">

<select id="validateByToken" parameterType="com.demo.login.pojo.User" resultType="java.lang.Integer">
select count(id) from mobile_login where token=#{token}
</select>

<select id="login" parameterType="com.demo.login.pojo.User" resultType="java.lang.Integer">
select count(user_id) from user where user_id = #{userId} and pass_word = #{passWord}
</select>

<insert id="insertOrUpdate" parameterType="com.demo.login.pojo.User">
INSERT INTO
		mobile_login(user_id,token,device_id,msg_uid,version,token_date,os_type) 
		VALUES
		(
		 #{userId}
		,#{token}
		,#{deviceId}
		,#{msgUid}
		,#{version}
		,date_add(NOW()
		,interval 10080 minute)
		,#{osType}
		) ON DUPLICATE KEY UPDATE
		 token = #{token}
		,device_id = #{deviceId}
		,msg_uid = #{msgUid}
		,version = #{version}
		,os_type = #{osType}
</insert>
</mapper>

数据库建表语句:


DROP TABLE IF EXISTS `mobile_login`;
CREATE TABLE `mobile_login` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` char(20) NOT NULL,
  `token` varchar(50) DEFAULT NULL,
  `device_id` varchar(100) DEFAULT NULL,
  `msg_uid` varchar(100) DEFAULT NULL,
  `version` varchar(20) DEFAULT NULL,
  `token_date` date DEFAULT NULL,
  `os_type` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id_unique` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` char(50) DEFAULT NULL,
  `user_name` varchar(50) DEFAULT NULL,
  `pass_word` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
关键的代码都在这上边了,感兴趣的小伙伴可以观看我录制的视频:

http://v.youku.com/v_show/id_XMzMxNzc1NDM5Mg==.html?spm=a2h3j.8428770.3416059.1








  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值