在项目中,考虑到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,并根据需要进行下一步操作。