Day13:跨域问题JSONP 和 单点登录

netstat -ano|findstr ":80"
taskkll /pid ----- /f

200 成功处理了请求,一般情况下都是返回此状态码;

304 访问的缓存“(未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 ”

400 参数类型匹配异常

404 找不动页面

500 错误代码
参考:https://www.cnblogs.com/cjwxf/p/6186287.html

实现页面通用跳转

需求:
请求:/user/login.html /user/register.html
要求使用一个方法实现页面的通用跳转
解决:采用RESTFul结构

需要新建jt-sso项目

第一部分 跨域问题JSONP

访问:http://manage.jt.com/web/item/562379
查看返回内容
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:当用户在后台manage.jt.com中发送ajax请求时,程序可以正常的调用,如果在www.jt.com中执行同样的代码程序不能正常执行
问题:为什么?

同源策略:

说明:
只有请求协议://域名:端口号都相同时,表示同源。同源后才能进行正常访问

1、图浏览器访问策略:
在这里插入图片描述
2、常见同源策略联系
在这里插入图片描述
跨域问题说明:
根据同源策略要求,不同的网站不能实现数据通信
核心:只有浏览器解析JS时,才有跨域的问题

问题:页面中的js比如调用银行的连接/其他公司的连接的操作会很多
问:如何实现
目标:实现跨域访问

跨域底层实现原理:
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript">
	$(function(){
		alert("检查JQuery函数类库是否有效???");
		$.get("http://manage.jt.com/test.json",function(data){
			alert(data.name);
		})
	})
</script>

在这里插入图片描述

能否利用JavaScript中的src属性实现数据请求的跨域???

实现原理:
1、定义回调函数function xxx( )
2、利用JavaScript中的src发起跨域请求
3、封装返回函数 回调函数名称(JSON) —》xxx(JSON)

<title>测试JSON跨域问题</title>	
	<script type="text/javascript">
		function hello(data){
			alert(data.name);
		}
		
	</script>
	<!-- 通过src实现跨域   前台服务器的页面通过src 连接到后台服务器 -->
	<script type="text/javascript" src="http://manage.jt.com/test.json"></script>
	<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
</head>

在这里插入图片描述

hello({"id":"1","name":"tom"})

在这里插入图片描述
在这里插入图片描述

跨域改进

1、定义回调函数 hello
2、定义请求:url:localhost:8091/test.json?callback=hello
3、接收数据.将数据进行拼接 获取callback参数(JSON)

在这里插入图片描述

JQuery中JsonP调用

Request URL:http://manage.jt.com/web/testJSONP?callback=hello&_=1566287144911

@Controller
@RequestMapping("/web")
public class JSONPController {

	@RequestMapping(value="/testJSONP",produces="text/html;charset=utf-8")
	@ResponseBody
	public String testJSONP(String callback) throws JsonProcessingException {
//		?callback=hello&_=1566287144911
		User user = new User();
		user.setId(101);
		user.setName("mmp");
	    //把对象转成json string类型的
		ObjectMapper objectMapper = new ObjectMapper();
		String json = objectMapper.writeValueAsString(user);
		
		return callback+"("+json+")";
	}
	
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中为何使用ObjectMapper?

ObjectMapper类是Jackson库的主要类 它提供一些功能将Java对象转换成JSON结构,反之亦然
它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写
https://www.cnblogs.com/zizi-tothemoon/p/9396386.html
===================================优化

//	mappingjacksonvalue
	@RequestMapping(value="/testJSONP")
	@ResponseBody
	public MappingJacksonValue testJSONP(String callback) throws JsonProcessingException {
//		?callback=hello&_=1566287144911
		User user = new User();
		user.setId(202);
		user.setName("呵呵");
//		把对象转成json string类型的
		MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
		mappingJacksonValue.setJsonpFunction(callback);
		
		return mappingJacksonValue;
	}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二部分 单点登录

新建sso-jt项目【注意 webapp】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

log4j日志

说明:log日志加载方式,一般需要经日志文件保存在项目根目录中,并且名称一般都是默认的log4j.properties/log4j.xml
日志jar:log4j.jar
加载过程:org.apache.log4j.LogManager有static静态代码块的配置文件,名称一般固定

pom.xml

<parent>
		<groupId>com.jt.zz</groupId>
		<version>0.0.1-SNAPSHOT</version>
		<artifactId>jt-parent</artifactId>
	</parent>

	<groupId>com.jt.zz</groupId>
	<version>0.0.1-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>com.jt.zz</groupId>
			<artifactId>jt-common</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>


	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>8093</port>
					<path>/</path>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.4.2</version>
				<configuration>
					<skipTests>true</skipTests>
				</configuration>
			</plugin>
		</plugins>

	</build>
</project>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编辑common的pojo

@Table(name="tb_user")
public class User extends BasePojo{

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long id; 
	private String username;
	private String password;   //md5加密
	private String phone;	//电话
	private String email;	//邮箱
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
common项目,每次修改后都需要打包
在这里插入图片描述
页面分析
1、分析页面url
2、分析页面js
3、快速检索工具“ctrl+h”
查找 http://sso.jt.com/user/check
在这里插入图片描述
在这里插入图片描述

@Controller
@RequestMapping("/user")
public class UserController {

	@Autowired
	private UserService userService;
	
//	完成用户信息校验
//	url:http://sso.jt.com/user/check/{param}/{type}
//	返回jsonP
	@RequestMapping("/check/{param}/{type}")
	@ResponseBody
	public MappingJacksonValue findCheckUser(
			@PathVariable String param,
			@PathVariable Integer type,
			String callback) {
//		true表示数据存在  false表示数据不存在
		boolean flag = userService.findCheckUser(param,type);
//		返回status:200    msg:OK   data:false
		SysResult result = SysResult.oK(flag);//所以调用SysResult
		MappingJacksonValue jacksonValue = new MappingJacksonValue(result);
		jacksonValue.setJsonpFunction(callback);
		return jacksonValue;
	}
public interface UserService {

	boolean findCheckUser(String param, Integer type);

}
@Service
public class UserServiceImpl implements UserService {

	@Autowired
	private UserMapper userMapper;

	public boolean findCheckUser(String param, Integer type) {
		// 将type转化为具体字段

		String cloumn = null;
		switch(type) {
		case 1:
			cloumn ="username";
			break;
		case 2:
			cloumn ="phone";
			break;
		case 3:
			cloumn ="email";
			break;
		}
		
//		获取用户记录总数
		int count = userMapper.findCheckUser(cloumn,param);
//		true表示已存在,false表示不存在
		return count==0?false:true;
	}

}
public interface UserMapper extends SysMapper<User>{

	int findCheckUser(@Param("cloumn")String cloumn, 
			@Param("param")String param);

}
<!-- namespace 映射文件的唯一标识 -->
<mapper namespace="com.jt.sso.mapper.UserMapper">

	<!-- 查询用户记录总数 -->
	<select id="findCheckUser" resultType="int">
		select count(*) from tb_user
		where
		${cloumn}=#{param}
	</select>
</mapper>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
是post请求,编辑HttpClient的post请求。而且是web服务器上的usercontroller的/doRegister

step1:单点登录服务

在这里插入图片描述
在这里插入图片描述

step2:common的httpClientService

@Service
public class HttpClientService {

	private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientService.class);

	@Autowired(required = false)
	private CloseableHttpClient httpClient;

	@Autowired(required = false)
	private RequestConfig requestConfig;

	/**
	 * url:addUser?id=1&name=tom httpClient get请求方式 参数: 1.String url
	 * 2.Map<String,String>,3.字符编码 /* //addUser?id=1&name=tom String paramUrl = url
	 * + "?"; for (Map.Entry<String,String> entry : params.entrySet()) { String key
	 * = entry.getKey(); String value = entry.getValue(); paramUrl = paramUrl + key
	 * + "=" + value + "&"; }
	 * 
	 * paramUrl = paramUrl.substring(0, paramUrl.length()-1);
	 */
	public String doGet(String url, Map<String, String> params, String charset) {
		String result = null;

		// 1.判断字符集编码是否为null
		if (StringUtils.isEmpty(charset)) {
			charset = "UTF-8";
		}

		try {
			// 2.判断是否有参数
			if (params != null) {
				URIBuilder builder = new URIBuilder(url);

				for (Map.Entry<String, String> entry : params.entrySet()) {

					builder.addParameter(entry.getKey(), entry.getValue());
				}
				// 利用工具类实现url拼接
				url = builder.build().toString();
			}

			// 发起http请求
			HttpGet httpGet = new HttpGet(url);
			httpGet.setConfig(requestConfig);
			CloseableHttpResponse httpResponse = httpClient.execute(httpGet);

			if (httpResponse.getStatusLine().getStatusCode() == 200) {
				// 获取返回值结果
				result = EntityUtils.toString(httpResponse.getEntity(), charset);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	// 重载方法
	public String doGet(String url) {

		return doGet(url, null, null);
	}

	public String doGet(String url, Map<String, String> params) {

		return doGet(url, params, null);
	}

	// ============================Post请求[难※※※※※※※※※※]
	public String doPost(String url, Map<String, String> params, String charset) {
		String result = null;

		// 1.判断字符集编码是否为null
		if (StringUtils.isEmpty(charset)) {
			charset = "UTF-8";
		}

		// 2.准备请求对象
		HttpPost httpPost = new HttpPost(url);
		httpPost.setConfig(requestConfig); // 定义超时

		try {
			// 3.判断参数是否为null
			if (params != null) {
				// 定义参数封装的List集合
				List<BasicNameValuePair> parameters = new ArrayList<>();
				for (Map.Entry<String, String> entry : params.entrySet()) {

					BasicNameValuePair nameValuePair = new BasicNameValuePair(entry.getKey(), entry.getValue());
					parameters.add(nameValuePair);
				}

				// 封装参数实体对象
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, charset);
				httpPost.setEntity(entity);
				// 将实体对象添加到请求对象中
			}

			// 发送post请求
			CloseableHttpResponse httpResponse = httpClient.execute(httpPost);

			if (httpResponse.getStatusLine().getStatusCode() == 200) {

				result = EntityUtils.toString(httpResponse.getEntity(), charset);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	// 方法重载
	public String doPost(String url) {

		return doPost(url, null, null);
	}

	public String doPost(String url, Map<String, String> params) {

		return doPost(url, params, null);
	}
}

step3:前台服务

在这里插入图片描述

@Service
public class UserServiceImpl implements UserService {
	@Autowired
	private HttpClientService httpClient;
	private static ObjectMapper objectMapper = new ObjectMapper();

	@Override
	public void saveUser(User user) {
		//1.定义远程的Url
		String url = "http://sso.jt.com/user/register";
		Map<String,String> params = new HashMap<>();
		params.put("username", user.getUsername());
		params.put("password", user.getPassword());
		params.put("phone", user.getPhone());
		params.put("email", user.getEmail());
		
		String sysResultJSON = 
				httpClient.doPost(url, params);
		
		//如何保证后台程序执行正确???? 200/201
		try {
			SysResult sysResult = 
					objectMapper.readValue(sysResultJSON,SysResult.class);
			
			if(sysResult.getStatus() != 200){
				throw new RuntimeException();
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
	}

结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值