java开发网站是很繁琐的事情,特别是写前端,每次运行都需要进行编译,所以需要配置跨域访问:
服务端
首先要创建一个CrossDomainFilter类,类继承了Servlet Filter接口,如下代码:
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by alan.luo on 2017/9/5.
*/
public class CrossDomainFilter extends Compact implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
try {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 跨域
String origin = httpRequest.getHeader("Origin");
if (origin == null) {
httpResponse.addHeader("Access-Control-Allow-Origin", "http://localhost/");
} else {
httpResponse.addHeader("Access-Control-Allow-Origin", origin);
}
httpResponse.addHeader("Access-Control-Allow-Headers", "Origin, x-requested-with, Content-Type, Accept,X-Cookie");
httpResponse.addHeader("Access-Control-Allow-Credentials", "true");
httpResponse.addHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
if ( httpRequest.getMethod().equals("OPTIONS") ) {
httpResponse.setStatus(HttpServletResponse.SC_OK);
return;
}
filterChain.doFilter(request, response);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
类方法主要是配置response的响应信息,告诉客户端,可以传递什么及使用什么方法过来。
接下来就是配置xml文件,打开web.xml文件,在过滤代码中加入以下代码:
<!-- 允许跨域 -->
<filter>
<filter-name>CrossDomainFilter</filter-name>
<filter-class>com.test.com.CrossDomainFilter</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CrossDomainFilter</filter-name>
<url-pattern>/*</url-pattern><!-- 配置允许跨域访问的的url-pattern -->
</filter-mapping>
到这里服务器就已经配置完毕了。
客户端
客户端直接使用ajax发起请求就可以:
/**
* 发起ajax请求
* @param url 请求地址
* @param data 请求参数(object)对象
* @param fnScuss 成功回调的函数
* @param fnError 失败回调的函数
* @returns {{get: get, post: post}}
*/
ajax: function (url, data, fnScuss, fnError) {
var _cacheKey = app.md5(url+JSON.stringify(data));
var _cache = null;
var _isCanCache = app.isCanCache(url);
url = this.constant.DOMAIN + url;
var http = function (method,header) {
if (method == null){
method = "POST";
}
if(header == null){
header = new Object();
}
$.ajax({
url: url,
data: data,
dataType: "json",
type: method,
headers: header,
beforeSend: function(xhr) {
xhr.withCredentials = true;
},
crossDomain:true,
success: function (e) {
if (typeof fnScuss == "function") {
//储存缓存
if (e.code == "1" && _isCanCache == true){
//app.cache.set(_cacheKey,e)
}
fnScuss(e);
}
},
error: function (e) {
if (typeof fnError == "function") {
fnError(e);
}
}
})
};
return {
get: function () {
//缓存判断
if (_isCanCache == true){
_cache = app.cache.get(_cacheKey)
if (_cache != null && typeof fnScuss == "function"){
fnScuss(_cache);
return true;
}
}
http("GET");
},
post: function (isJson) {
//缓存判断
if (_isCanCache == true){
_cache = app.cache.get(_cacheKey)
if (_cache != null && typeof fnScuss == "function"){
fnScuss(_cache);
return true;
}
}
var header = new Object();
if (isJson == true){
header['Content-Type'] = "application/json";
}
http("POST",header);
},
delete:function () {
http("DELETE");
},
put:function () {
http("PUT");
}
}
},
app.event("#getToken", "click", function () {
app.ajax("/project/api/getToken", {type:"1"}, function (e) {
app.log(e);
if (e.code == 1) {
}
}).post();
});
近期评论