单点登录3

在登录的时候,不只是客户端能登录,服务器端,也是一个完整的登录项目。

通过前面两篇可以看出,我的架构用的是spring 的MVC和spring注解,其实我根本就不明白,只是会用那么一点。

下面是登录方法的代码,包括,本地登录,和客户端的登录两种。

package com.tujia.tuuser.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.util.WebUtils;

import com.tujia.common.config.ResultCode;
import com.tujia.common.exception.UnAuthedException;
import com.tujia.core.security.SecurityUtil;
import com.tujia.core.util.Md5Util;
import com.tujia.core.util.ParamChecker;
import com.tujia.tuuser.entity.User;
import com.tujia.tuuser.service.UserService;

@Controller
public class UserLoginController extends BaseController {

	@Resource
	private UserService UserService;
	@Resource
	private SecurityUtil securityUtil;

	@RequestMapping(value = "/tulogin", produces = "text/html")
    public String listByUser(Model model,HttpServletRequest request, HttpServletResponse response) {

		securityUtil.requrl(request,response);
    	return "tulogin";
    }

	/**
	 * 登录方法/本地登录
	 * @param map
	 * @param request
	 * @param response
	 */
	@RequestMapping(value = "/tulogin")
	public void loginServer(@RequestBody Map<String, Object> map,
			HttpServletRequest request, HttpServletResponse response) throws UnAuthedException {
		response.setCharacterEncoding("UTF-8");
		String phone = (String) map.get("phone");
		String password = Md5Util.md5((String) map.get("password"));

		ResultCode resultCode = ResultCode.SUCCEED;
		Object result = null;

		try {
			ParamChecker.notEmpty("phone", phone);
			ParamChecker.notEmpty("password", password);

			User user = UserService.login(request, response, phone, password);

			String requrlCookie = securityUtil.getReqURL(request,response);
			result = requrlCookie; 

		} catch (UnAuthedException e) {
			logger.error(e.getMessage());
			resultCode = e.getResultCode();
			result = e.getMessage();

		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			resultCode = ResultCode.INTERNAL_ERROR;
			result = e.getMessage();
		}
		setResponse(response, resultCode, result);
	}

	/**
	 * 退出接口
	 */
	@RequestMapping(value = "/tulogout",method =RequestMethod.POST)
	public void logout(
			HttpServletRequest request, HttpServletResponse response) {
		ResultCode resultCode = ResultCode.SUCCEED;
		UserService.logout(request, response);
		Object result = null;
		setResponse(response, resultCode, result);
	}

	//登录接口,客户端通过此方法进行登录。
	@RequestMapping(value = "/tuloginMethod")
	public void login(@RequestBody Map<String, Object> map,
			HttpServletRequest request, HttpServletResponse response) throws UnAuthedException {
		response.setCharacterEncoding("UTF-8");
		String phone = (String) map.get("phone");
		String password = Md5Util.md5((String) map.get("password"));
		ResultCode resultCode = ResultCode.SUCCEED;
		Object result = null;
		User user = null;
		String token = null;

		try {
			ParamChecker.notEmpty("phone", phone);
			ParamChecker.notEmpty("password", password);

			user = UserService.login(request, response, phone, password);
			token = (String) request.getAttribute("token");
		} catch (UnAuthedException e) {
			logger.error(e.getMessage());
			resultCode = e.getResultCode();
			result = e.getMessage();

		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			resultCode = ResultCode.INTERNAL_ERROR;
			result = e.getMessage();
		}
		setResponseMethod(response, resultCode, result, user , token);
	}

	//tokenMethod,通过token,客户端验证用户是否登录。
	@RequestMapping(value = "/tokenMethod")
	public void tuloginMethod(@RequestBody Map<String, Object> map,
			HttpServletRequest request, HttpServletResponse response) throws UnAuthedException {

		response.setCharacterEncoding("UTF-8");
		String token = (String) map.get("token");
		boolean tokenServer = securityUtil.getAuthTuUser(token);
		String ret = "";
        try {
			PrintWriter out = response.getWriter();
			if(tokenServer){
				ret = "success";
				out.println(ret);
	            out.close();
			}else{
				ret = "noLogin";
				out.println(ret);
	            out.close();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

其中,在方法后面的

setResponseMethod

这个方法,就是传值的,通过json来传值。给前台,或者给客户端。

下面是代码。

protected void setResponse(HttpServletResponse resp, ResultCode resultCode,
            Object result) {
        setResponse(resp, resultCode, result, null);
    }

    protected void setResponse(HttpServletResponse resp, ResultCode resultCode,
            Object result, String callback) {
        try {
            resp.setCharacterEncoding("utf-8");
            PrintWriter out = resp.getWriter();

            Map<String, Object> ret = new LinkedHashMap<String, Object>();
            ret.put("code", resultCode.getCode());
            ret.put("data", result);
            String responseStr = GSON.toJson(ret);
            out.println(responseStr);
            out.close();

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }

这个是往前台页面传递值的。
另一个,是给客户端传递值的。代码如下。

protected void setResponseMethod(HttpServletResponse resp, ResultCode resultCode,
            Object result,User user,String token) {
        setResponseMethod(resp, resultCode, result,user,token , null);
    }
    protected void setResponseMethod(HttpServletResponse resp, ResultCode resultCode,
            Object result,User user ,String token , String callback) {
        try {
        	resp.setCharacterEncoding("utf-8");
            PrintWriter out = resp.getWriter();
            Map<String, Object> ret = new LinkedHashMap<String, Object>();
            ret.put("code", resultCode.getCode());
            ret.put("data", result);
            ret.put("user", user);
            ret.put("token", token);
            String responseStr = GSON.toJson(ret);
            out.println(responseStr);
            out.close();
            resp.setCharacterEncoding("utf-8");

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }

这两个传递的json,引发出来两个问题,

一个是,在JS中,怎样解析JSON,获取其中的数据。

一个是,json中的json怎样转化成User对象。

这两个问题,都看另外两篇文章吧。

时间: 2024-09-12 22:57:50

单点登录3的相关文章

django-Django-cas 单点登录求助大神

问题描述 Django-cas 单点登录求助大神 报错信息:[Errno socket error] [Errno 1] _ssl.c:504: error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error Django Setting文件里面已经安装配置配置了,附上setting部分代码: INSTALLED_APPS = ( 'django.contrib.admin' 'django.contri

session-aspx单点登录 怎么判断不正常退出,将SQL数据库一字段改成true

问题描述 aspx单点登录 怎么判断不正常退出,将SQL数据库一字段改成true 我做了一个系统,在同一时间,一个帐号只能一个登录,我把数据库帐号表加了一个列,用来判断是否登录,如果没登录,为true,如果登录后,就改为false,然后在登陆界面判断这个列是true还是false,如果是false就弹框,不能进去. 只有用户自己安全退出,才把false改成true 我的帐号使用session传值的. 现在有个麻烦,就是如果直接关掉游览器,那这个列的字段不会自己变成true,怎么办?还有直接断电和

单点登录多用户触发同步机制

问题描述 单点登录多用户触发同步机制 多用户同步指每次什么时间点来触发用户同步机制? 注:有些用户是长时间不会登陆的 解决方案 keep-alive心跳机制,服务器推,等等.

网页-java单点登录SSO,模拟登录

问题描述 java单点登录SSO,模拟登录 要做一个Java单点登录系统,用户登录系统后,可以直接跳转到所需的子系统主页,无需再输入用户名密码.网上查了些资料,准备用cas实现,但发现子系统有权限管理,举个例子,用户所属部门不同,能访问的某个子系统的主页也不一样,cas貌似无法解决,想问下cas是不是真的没办法解决这个问题? 后来准备自己手动实现,有一个子系统是get方式传递用户名密码,自不必说,很容易实现.但有好几个是post方式传参,我开始使用HttpURLConnection模拟登录,但未

CAS单点登录(SSO)完整教程

CAS单点登录(SSO)完整教程(2012-02-01更新) 一.教程说明 前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server), 官网:http://www.jasig.org/cas 本教程环境: Tomcat6.0.29 JDK6 CAS Server版本:cas-server-3.4.3.1.cas-server-

集中权限管理系统-java 跨域单点登录结合集中权限管理 权限控制采用shiro

问题描述 java 跨域单点登录结合集中权限管理 权限控制采用shiro 这种需求的系统谁做过 之前 参考了 网上博客的 oauth2 但是发现不太符合我这个需求 因为oauth2只是授权 并不能解决 登录集中权限系统后 登录其他网站的问题 现在的需求是 用户权限系统只需要一个系统来 维护其他系统 没有用户系统 统一先通过集中权限系统登录后进行用户角色权限维护 如果先登录其他系统这跳转到集中权限系统进行先登录 而且也不能解决集中权限管理的问题 我想过可能需要redis来 实现这功能 但是 总感觉

java-cas 单点登录的问题:

问题描述 cas 单点登录的问题: 1客户端后台获取到的密码有什么作用2/**check前方法*/ beforChecks(userDetails authentication); SecLoaderManager.getInstance().setPasswordEncoder(getPasswordEncoder()); SecLoaderManager.getInstance().setSaltSource(getSaltSource()); /**执行认证策略方法*/ if(authUs

CAS解决单点登录SSO

关于CAS很多的原理和基础的配置启动,网上是很多的,我更多是结合我的实践和心得.需要了解CAS的原理,认证协议,认证流程,可以参考以下文章. 让CAS支持客户端自定义登陆页面--客户端篇 CAS原理与配置-基于CAS的单点登陆的研究(上) 服务端配置 CAS单点登陆部署 CAS配置手册 CAS单点登录配置 背景 单点登录(SSO)是企业开发的重要问题,在我的毕设项目中,由于要和系统其他开发模块共用用户认证模块,方便共享用户资源,所以需要一个好的SSO解决方案. 一般SSO的实现机制有两种:基于s

谁都能看懂的单点登录(SSO)实现方式(附源码)

SSO的基本概念 SSO英文全称Single Sign On(单点登录).SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方案之一.(本段内容来自百度百科) 今天这篇文章将介绍SSO的一种实现方式,代码超简单,仅用来验证我的思路是否可行,具体细节请大家来完善! 二级域名的单点登录 什么是二级域名呢?例如: site1.domain.com site2.domai

asp.net 简单单点登录技术分析

代码如下: 复制代码 代码如下: ///单点登录(Single Sign On) public void SSOMethods(string username, string password) { //判断登录情况 此处方法省略-- int result = CheckLogin(username, password); if(result>0) { //唯一标识,可自行设定 string key = string.Format("{0}_{1}",username, pass