Struts2 json请求中拦截session是否合法的情况

前台和后台交互主要有两种方式。

一种是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>


完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值