请求路径获取:
1. request.getScheme() 返回当前链接使用的协议;
2. request.getServerName() 获取网站的域名;
3. request.getServerPort() 获取的服务器的请求端口;
4. request.getContextPath()获取当前的系统路径;
后端代码:
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class LoginInterceptor implements HandlerInterceptor{
private static Logger logger = Logger.getLogger(LoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
response.setHeader("Access-Control-Allow-Origin", "http://localhost"); // 允许跨域请求
response.setHeader("Access-Control-Allow-Credentials", "true");
HttpSession session = request.getSession();
Object userId = session.getAttribute("userId");
if(userId == null){
logger.info("用户未登录");
requestDirect(request, response);
return false;
}else{
return true;
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
public void requestDirect(HttpServletRequest request, HttpServletResponse response) throws IOException{
//获取当前请求的路径
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+request.getContextPath();
//如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求
if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
//前端需要判断是否是重定向
response.setHeader("REDIRECT", "REDIRECT");
//需要重定向的路径
response.setHeader("CONTENTPATH", basePath+"/login.html");
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
}else{
response.sendRedirect(basePath + "/login.html");
前端代码:
下面的代码请放在全局的js中 (用于初始化ajax请求,让它结束之后运行completer后面的函数)
var jqxhr;
//设置ajax请求完成后运行的函数,
$.ajaxSetup({
complete:function(){
if("REDIRECT" == jqxhr.getResponseHeader("REDIRECT")){ //若HEADER中含有REDIRECT说明后端想重定向,
var win = window;
while(win != win.top){
win = win.top;
win.location.href = jqxhr.getResponseHeader("CONTENTPATH");//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
$.ajaxSetup()方法的详解链接
原因:ajax请求默认就是不支持重定向的,因为它是局部刷新,不重新加载页面。解决方案:开发中需要多处使用重定向的情况下,大多都是在Spring mvc 的拦截器中,或过滤器中使用,此方法是在spring mvc拦截器中实现。在拦截器中通过获取session(我的用户信息是存在session中)判断用户的登陆状态,没有登陆重定向到登陆页面。请求路径获取:1. requ
xmlHttpRequest对象的status代表当前http请求的状态,是一个长整型数据,现在介绍一下它的含义。 http请求状态及其含义表 1xx – 信息提示 100 – 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新) 101 – 服务器将遵从客户的请求转换到另外一种协议。(HTTP 1.1新) 2xx – 成功 200 – OK 一切正常,对GET和POST请求的应答文档跟在后面。 201 – Created 服务器已经创建了文档,Location头给出了它的URL。 202 – Accepted 已经接受请求,但处理尚未完成。 203 – Non-Auth
在修改公司的老项目中,遇到了一个问题,就是session失效的时候,在页面没有刷新的情况下,点击操作无效,查了一下,原因是ajax机制无法实现重定向,查了很久的资料,现有一下解决方法(都是百度得来的,自己整理一下方便以后使用)
1.ajax 是默认就是不支持重定向的,它是局部刷新,不重新加载页面。
2.我的解决办法就是从前后端都做处理,项目中遇到重定向大多出现在拦截器或者过滤器中。在项目中我使...
之后js模块需要增加逻辑代码,特殊要求,所以改成了ajax进行异步请求。
最后发现用ajax请求的地址在处理后拦截器并不拦截此请求,也不会进行跳转(ps:当然不会跳转了),这让我一直感觉我的拦截器地址配置写错了,进行一番查阅后,这里对这个问题进行了一些梳理
aja...
在项目中,考虑到web前台ajax请求未登录资源时,后台返回的重定向信息,ajax不能自动判断是否是重定向,以下是一种折中方法,如各位有什么更好的方法,还请告诉我一声,哈哈
下面进入正题.............
LoginInterceptor.java:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.
服务器端重定向:response.sendRedirect(url)
ajax请求接收到状态码:302,同时response header 中增加Location字段,浏览器会自动重定向到该地址,之后再通知ajax接收重定向后的返回信息
以下是chrome的结果
火狐浏览器
服务器端重定向:response.sendRedirect(url)
chrome浏览器支持自动重定向,火狐......
今天发现,当使用Ajax请求时,如果后台进行重定向到其他页面时是无法成功的,只能在浏览器地址栏输入才能够实现重定向。
Ajax默认就是不支持重定向的,它是局部刷新,不重新加载页面。
需要实现的功能是,后台网关拦截请求,看请求中是否存在token.如果不存在就跳转到登录页面。因为大多数请求都是使用Ajax.一开始发现无法进行重定向,每次都是返回到Ajax的结果处理函数。最终的解决办法如下,需要后台和前端进行处理。
*功能描述
* @author lgj
* @Description 重定向工具类
* @date 2/27/19
@Slf4j
public class
遇到的情景是在当前端
发送ajax请求到后端,后端有拦截器拦截了该
请求,但是拦截后不会执行跳转的代码,没有拦截器这个方法同样有用。
思路:我们在响应头中自定义一个信息,前端拿到这个信息后就执行跳转代码。
后端代码:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
..... 拦截逻辑省略
一个页面发ajax请求到后端接口,这个后端接口重定向了另外一个域名的地址;此时会出现跨域问题。
ajax调用浏览器组件发起的请求和浏览器直接发起的请求有一定区别。
1)浏览器可以通过返回的http状态进行相应的操作,如访问一个页面,此页面重定向时,浏览器可以获取到重定向后的url然后进行转向。
2)对于ajax,ajax的目的就是无刷新的,所以对于服务器端进行了重定向时,ajax会获