前台和后台交互主要有两种方式。
一种是form表单提交,一种是模拟form进行ajax封装json格式提交。form表单提交可以直接设置strsuts2拦截器拦截session中对象进行用户是否登录进行合法性判断,网上大多数都是这样一种方式的教程。
现在要说的是第二种方式,也就是ajax表单请求如何拦截以及如何跳转:
form表单html代码如下:
<form id="pictureForm">
<table class="table table-striped">
<thead>
<tr>
<th>图片序号</th>
<th>图片名称</th>
<th>图片大小</th>
<th>图片类别</th>
<th>上传时间</th>
<th>上传者</th>
<th>预览</th>
<th>是否删除</th>
</tr>
</thead>
<tbody id="pictureTbody">
</tbody>
</table>
<button type="button" οnclick="savePictureForm()"
class="btn btn-warning btn-lg">保存</button>
</form>
form表单请求js代码如下:
// 提交图片修改
function savePictureForm() {
$.ajax({
type : "post",
url : "jsonkpi/savePictureChange.action",
data : $("#pictureForm").serialize(),
cache : false,
dataType : "json",
success : function(dta) {
if (d.logonFailed == 1) {
window.location.href = "/Myweb/logon.jsp";
}
alert(dta.msg);
return;
},
error : function(dta) {
alert("保存失败...");
}
});
}
由于是json格式请求,后来拦截器判断后即使是在struts2中配置跳转网页,也无法生效,会导致form表单ajax请求得到的数据是返回的网页,这样我们只能通过判断拦截请求后返回的json数据来进行判断。
struts.xml中配置如下:
<package name="jsonkpi" extends="json-default">
<interceptors>
<!-- 自定义拦截器 -->
<interceptor name="permission"
class="com.myweb.action.interceptor.SessionIterceptor" />
<!-- 配制默许的拦截器到拦截器栈 -->
<interceptor-stack name="permissionStack">
<interceptor-ref name="permission" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<global-results>
<result name="logon_failed" type="redirectAction">/jsonkpi/logonFailed.action
</result>
</global-results>
.........
</package>
后台sessioniterceptor中代码如下:
public class SessionIterceptor extends AbstractInterceptor {
/** serialVersionUID */
private static final long serialVersionUID = -2778018142445335470L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//取得请求的URL
String url = ServletActionContext.getRequest().getRequestURL().toString();
//对登录与注销请求直接放行,不予拦截
if (url.indexOf("logon") != -1 || url.indexOf("logonOut") != -1) {
return invocation.invoke();
}
ActionContext ctx = invocation.getInvocationContext();
User user = (User) ctx.getSession().get("USER");
if (user != null) {
return invocation.invoke();
}
//如果超时,返回提示页面
return "logon_failed";
}
}
因为如果session验证失败,全局配置的是跳转到指定action,但是一般的action都是返回的网页,需要注意返回json格式的action的写法,如下是logonFailed.action的配置和代码:
public class AdminAction extends ActionSupport {
/** */
private static final long serialVersionUID = -4149993028729686564L;
public Map responseJson;
public String logonFailed() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("logonFailed", 1);
this.setResponseJson(map);
return Action.SUCCESS;
}
.......
}
<package name="jsonkpi" extends="json-default">
<action name="logonFailed" class="com.myweb.action.AdminAction"
method="logonFailed">
<result type="json">
<param name="root">responseJson</param>
</result>
</action>
</package>
拦截器配置好了,接下来就可以给指定的action请求配置拦截器进行json格式ajax请求的拦截了,例如:
<action name="addAndUpdateCategories" class="com.myweb.action.CategoryAction"
method="addAndUpdateCategories">
<interceptor-ref name="permissionStack" />
<result type="json">
<param name="root">responseJson</param>
</result>
</action>
完成!