在项目中,考虑到web前台ajax请求未登录资源时,后台返回的重定向信息,ajax不能自动判断是否是重定向,以下是一种折中方法,如各位有什么更好的方法,还请告诉我一声,哈哈

下面进入正题.............

LoginInterceptor.java:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.yasinyt.loan.admin.entity.User;
import com.yasinyt.loan.admin.util.IPUtils;
 * 登陆拦截器
 * @projectName loan-admin
 * @packageName com.yasinyt.loan.admin.interceptor
 * @author E-mail: liuzongyang@yasinyt.com
 * @date 2017年10月7日 上午9:15:35 
 * @version 1.0
 * @description 如果用户未登录,或者登陆超时,访问需要登录访问的资源时则会重定向到登陆页面
public class LoginInterceptor extends HandlerInterceptorAdapter {
	private static Logger log = LoggerFactory.getLogger(LoginInterceptor.class);
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 获得请求路径的uri
		String uri = request.getRequestURI();
		HttpSession session = request.getSession();
		// 进入登录页面,判断session中是否有key,有的话重定向到首页,否则进入登录界面
		User user = (User) session.getAttribute(session.getId());
		if (uri.contains("login") || uri.contains("getYzm")) {
			return true;
		}else {
			String ipv4 = IPUtils.getRequestIp(request);
			if ( user == null) {
				StringBuilder sb = new StringBuilder();
				String port = "",contextPath="";
				if(request.getServerPort()!=80){
					port = ":" + request.getServerPort();
				if(StringUtils.isNoneBlank(request.getContextPath().replace("/", ""))){
					contextPath = request.getContextPath();
				sb.append(request.getScheme()).append("://").append(request.getServerName()).append(port).append(contextPath).append("/login");
				String loginPath =  sb.toString();   
				log.warn("发起请求IP未登录:IP:{}", ipv4);
				//判断如果是ajax,则需要设置response参数,告诉ajax这是重定向
				//这里设置完之后,需要到common.js中设置jquery-ajax默认设置,详细查看$.ajaxSetup方法
				String type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");
				if ("XMLHttpRequest".equals(type)) {
                    response.setHeader("REDIRECT", "REDIRECT");//告诉ajax这是重定向  
                    response.setHeader("CONTEXTPATH", loginPath);//重定向地址  
                    response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                    return false;
                }else{//如果不是ajax请求,则直接重定向
                    response.sendRedirect(loginPath);  
                    return false;  
			} else{ 
				log.info("发起请求IP:{},sessionId:{},用户名:{},姓名:{}", 
						ipv4, 
						session.getId(),
						user.getUserName(),
						user.getRealName()
				return true;


前端jquery.ajax默认设置,ajax设置要放在程序ajax调用前,我一般放在jsp统一引用文件头里的,这样调用ajax的时候就无需操心其他设置了 * ajax默认设置 * 包括默认提交方式为POST, * 判断后台是否是重定向 $.ajaxSetup( { //设置ajax请求结束后的执行动作 complete : function(XMLHttpRequest, textStatus) { // 通过XMLHttpRequest取得响应头,REDIRECT var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT说明后端想重定向 if (redirect == "REDIRECT") { var win = window; while (win != win.top){ win = win.top; //将后端重定向的地址取出来,使用win.location.href去实现重定向的要求 layerAlert(layer,"您的登录信息已超时,请重新登录<p class='ps'>ps:在客户端闲置10分钟后系统会自动登出</p>",'登录超时提示',5,'',0,function(){ win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH"); type:'POST' 在项目中,考虑到web前台ajax请求未登录资源时,后台返回的重定向信息,ajax不能自动判断是否是重定向,以下是一种折中方法,如各位有什么更好的方法,还请告诉我一声,哈哈下面进入正题.............LoginInterceptor.java:import javax.servlet.http.HttpServletRequest;import javax.servlet. //1.设置响应状态码 302 ,表示定向,(已搬迁) //2.// 设置响应头,说明 新的地址在哪里 resp.sendRedirect("http://localhost:8080/--/--");
Ajax请求如何定向 在前端使用Ajax请求,后端使用HttpServletResponse.sendRedirect(“URL”);的情况下,页面并未发生跳转,这是为什么呢? 默认ajax是不支持定向的,因为ajax本身就是局部刷新,不新加载页面的。 后端java设置定向Header HttpServletResponse response = CommonUtils.getHttpServletResponse(); HttpServletRequest request =
由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决 ajax的跨域问题。本篇将讲述一个小白从遇到跨域不知道是跨域问题,到知道是跨域问题不知道如何解决,再到解决跨域问题,最后找到两种方法解决ajax 跨域问题的全过程。 不知是跨域问题 起 因是这样的,为了复用,减少复开发,单独开发了一个用户权限管...
在修改公司的老项目中,遇到了一个问题,就是session失效的时候,在页面没有刷新的情况下,点击操作无效,查了一下,原因是ajax机制无法实现定向,查了很久的资料,现有一下解决方法(都是百度得来的,自己整理一下方便以后使用) 1.ajax 是默认就是不支持定向的,它是局部刷新,不新加载页面。 2.我的解决办法就是从前后端都做处理,项目中遇到定向大多出现在拦截器或者过滤器中。在项目中我使...
1、什么是Ajax Ajax:即异步 JavaScript 和XML。Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不新加载整个网页的情况下,对网页的某部分进行更新。而传统的网页(不使用 Ajax)如果需要更新内容,必需载整个网页面。 2、同步与异步的区别 同步提交:当用户发送请求时,当前页面不可以使用,服务器响应页面到客户端,响应完成,用户才可以使用页面。 异步提交:当用户发送请求时,当前页面还可以继续使用,当异步请求
以前写response.sendRedirect("/login.jsp");是成功的 今天用到ajax请求,发送给后台,希望遇到错误了  直接跳转,发现无效 首先要深入了解ajax请求和response.sendRedirect的机制 response.sendRedirect的机制 首先我们要明白用response.sendRedirect做转向的原理,它其实是向浏览器发送一个特殊
ajax请求中,如果服务器端的响应是302 Found,在ajax的回调函数中能够获取这个状态码吗?能够从Response Headers中得到Location的值进行定向吗?让我们来一起看看实际情况。 使用jquery的$.ajax()发起ajax请求的javascript代码如下: $.ajax({ url: '/oauth/respond', type: 'p...
当使用 Ajax 发送请求时,如果服务器返回 302 状态码,则说明请求需要定向到另一个 URL。这种情况下,Ajax 请求会自动跟随定向,但是浏览器并不会自动更新页面。 如果你想要在 Ajax 请求中获取定向后的 URL,可以使用 XMLHttpRequest 对象的 `getResponseHeader()` 方法获取 `Location` 头部字段的值。例如: var xhr = new XMLHttpRequest(); xhr.open('GET', '/example'); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 302) { var redirectUrl = xhr.getResponseHeader('Location'); console.log('Redirect URL:', redirectUrl); } else { console.log('Response:', xhr.responseText); xhr.send(); 这样,你就可以获取到定向后的 URL,并根据需要进行下一步操作。