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();
}
}