1. 程式人生 > >ios或安卓登入java後臺token校驗機制簡介

ios或安卓登入java後臺token校驗機制簡介

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