什么是跨域呢?
> [https://segmentfault.com/a/1190000000718840](https://segmentfault.com/a/1190000000718840)
為什么不允許跨域呢?

總結:無論是瀏覽器,還是服務器,從用戶的安全角度出發,默認都是不允許進行跨域訪問的。而我們前后端分離的思想,將來需要將前臺和后臺布署到不同的服務器上,前臺和后臺擁有不同的域名。前臺將數據發送給不同域的后臺,后臺再數據返回不同域名的前臺。這就避免不了跨域的問題。
## ServletResponseAware
在Struts中,我們使用實現`ServletResponseAware`接口的方法實現設置請求文件頭,從而實現跨域目的。
[http://127.0.0.1:8088/struts2-core-apidocs/org/apache/struts2/interceptor/ServletResponseAware.html](http://127.0.0.1:8088/struts2-core-apidocs/org/apache/struts2/interceptor/ServletResponseAware.html)
繼承后,我們實現其中的唯一的`setServletResponse(HttpServletResponse response)`方法
```
package com.mengyunzhi.javaee.action.teacher;
...
import org.apache.struts2.interceptor.ServletResponseAware;
...
public class Index extends ActionSupport implements ServletResponseAware{
...
@Override
public void setServletResponse(HttpServletResponse response) {
// 設置發送文件頭:允許跨域的地址
response.setHeader("Access-Control-Allow-Origin", "*");
// 允許Credentials
response.setHeader("Access-Control-Allow-Credentials", "true");
// 允許的請求方法
response.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
// 允許的請求頭
response.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
}
...
```
此時,我們再訪問[http://127.0.0.1:8080/javaee/teacher/](http://127.0.0.1:8080/javaee/teacher/), 查看控制臺的網絡選項卡,然后找到這條請求,查看響應信息:

發現在響應的一欄中,增加了一項:Access-Control-Allow-Origin,值為*。當我們的瀏覽器接收到此項信息時,就不會提示非法跨域的提示了。當然了,不僅如此,為了更好的配合跨域,在上述`setServletResponse`方法中,我們還增加了其它的幾個選項。有了這幾項設置,我們的后臺才真正的成為了一個可用的API。
<hr />
```
package com.mengyunzhi.javaee.action.teacher;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.mengyunzhi.javaee.entity.Teacher;
import com.opensymphony.xwork2.ActionSupport;
public class Index extends ActionSupport implements ServletResponseAware{
/**
* 定義serialVersionUID,增強兼容性
*/
private static final long serialVersionUID = 1L;
// 教師列表 類型為List,每項均為Teacher。
private List<Teacher> teachers;
// 當前頁
private int page = 1;
// 每頁大小
private int pageSize = 2;
// 查詢姓名
private String name = "";
// 顯示接收到的page信息
public int getPage() {
return page;
}
// 接收請求的page信息
public void setPage(int page) {
this.page = page;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setTeachers(List<Teacher> teachers) {
this.teachers = teachers;
}
// V層在展示數據teachers的時候,將自動調用該方法
public List<Teacher> getTeachers() {
return teachers;
}
// 該execute方法將被自動調用, 方法的返回類型必須為String
public String execute() {
// 獲取教師列表
// 未輸入姓名,則查詢所有信息
if (name.equals("")) {
teachers = Teacher.paginate(page, pageSize);
// 輸入姓名,則進行模糊查詢
} else {
teachers = Teacher.paginate(name, page, pageSize);
}
return SUCCESS;
}
@Override
public void setServletResponse(HttpServletResponse response) {
// 設置發送文件頭:允許跨域的地址
response.setHeader("Access-Control-Allow-Origin", "*");
// 允許Credentials
response.setHeader("Access-Control-Allow-Credentials", "true");
// 允許的請求方法
response.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
// 允許的請求頭
response.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
}
}
```
- README
- 第一章:準備
- 第二章:Hello World!
- 第一節:查看工程文件
- 第二節:JDK、JRE與環境變量
- 第三節:index.jsp
- 第三章:Hello Struts
- 第一節:Web.xml
- 第二節:單入口
- 第三節:Hello Struts
- 第四節:觸發C層
- 第四章:建立數據表
- 第一節:建立實體類
- 第二節:測試一
- 第三節:測試二
- 第四節:引入Hibernate
- 第五節:配置Hibernate
- 第六節:建立連接
- 第七節:實體類映射數據表
- 第八節:完善數據表
- 第五章:教師管理
- 第一節:增加數據--add
- 第二節:增加數據--save
- 1 獲取傳入數據數據
- 2 數據寫入測試
- 3 對接C層
- 第三節:數據列表
- 1 獲取數據
- 2 重構代碼
- 3 C層對接--初始化
- 4 C層添加數據
- 5 V層顯示數據
- 6 獲取數據庫中數據
- 7 顯示性別
- 8 分頁
- 9 條件查詢
- 第四節:修改數據
- 1 edit
- 2 update
- 第五節:刪除數據
- 第六節:總結
- 第六章:重構C層
- 第一節:繼承ActionSupport類
- 第二節:數據驗證
- 第七章:前臺分離(前臺)
- 第一節:環境搭建
- 第二節:運行環境
- 第三節:共享開發環境
- 第四節:生產環境
- 第八章:前臺開發(前臺)
- 第一節:本地化
- 第二節:教師列表
- 1 引入M層
- 2 模擬后臺返回數據
- 3 C與M對接
- 4 C與V對接
- 第九章:前后臺對接(前后臺)
- 第一節:后臺輸出json(后臺)
- 第二節:對接前臺(全棧)
- 第二節:對接API(前臺)
- 第二節:跨域請求(后臺)
- 第三節:重構代碼(前臺)
- 第十章:重構后臺M層
- 第一節:數據訪問DAO層
- 第二節:項目整體重構
- 第十一章:用戶登陸(前后臺)
- 第一節:制定規范
- 第二節:定制測試用例
- 第三節:后臺輸入測試代碼(后臺)
- 第四節:postman(后臺)
- 第五節:新建用戶登陸模塊(前臺)
- 第六節:代碼重構(前臺)
- 第十二章:班級管理(前后臺)
- 第一節:班級列表
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第二節:Add
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第三節:Save
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第四節:Edit
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第五節:Update
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第六節:Delete
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第七節:小結
- 第十三章:班級管理(API)
- 第一節:ER圖
- 第二節:create
- 1 實體層
- 2 dao層
- 3 service(server)層
- 4 action層
- 第三節:ManyToOne
- 第四節:Read
- 1 service(server)層
- 2 action層
- 第五節:update
- 1 service(server)層
- 2 action層
- 第六節:update
- 第十四章:重構服務層