GVKun编程网logo

vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)

15

如果您对vue根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于vue根据接口返回的状态码判断用户登录状态

如果您对vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面的详细内容,我们还将为您解答http拦截器的相关问题,并且为您提供关于ajaxsetup,结合拦截器处理session过期,跳转登录页面、angular – 尝试在http拦截器中进行重定向到403错误的登录页面、discuz 怎样判断用户登录状态比价好?、Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页的有价值信息。

本文目录一览:

vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)

vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)

背景:后台接口返回code==501表示用户是未登录状态,需要登录才可访问;

通过http拦截做路由跳转

 第一步:src目录下新建http.js文件,内容如下:

import Axios from ''axios''
import { Loading, Message, MessageBox } from ''element-ui''
// 超时时间
Axios.defaults.timeout = 5000
// http请求拦截器
var loadinginstace
Axios.interceptors.request.use(config => {
   // element ui Loading方法
       loadinginstace = Loading.service({ fullscreen: true })
   return config
}, error => {
   loadinginstace.close();
   Message.error({
         message: ''网络不给力,请稍后再试''
     })
   return Promise.reject(error)
})
//   http响应拦截器
Axios.interceptors.response.use(data => {
    // 响应成功关闭loading
    loadinginstace.close();
    const code = data.data.code;
    if(code == 501) { //未登录
        MessageBox.alert(''请先登录'', ''提示'', {
            confirmButtonText: ''确定'',
            callback: action => {
                router.replace({
                    name: ''login'',
                    query: {redirect: router.currentRoute.fullPath} //登录后再跳回此页面时要做的配置
                })
            }
        });
    }
    return data
}, error => {
    loadinginstace.close();
    Message.error({
         message: ''网络不给力,请稍后再试''
     })
    return Promise.reject(error)
})

 2.从main.js中引入

import ''./http.js''

 3.登录页设置login.vue

                 if(this.$route.query.redirect){
                                this.$router.push({path: decodeURIComponent(this.$route.query.redirect)}) //跳转到原页面
                            }else{
                                this.$router.push({name: ''userIndex'', query: {id: 0}});//正常登录流程进入的页面
                            }

 

2019-04-14更新:

tip1: 平台右上角需要显示用户名,后台在登录时返回了用户名称信息,将他放在cookie中,在头部组件中调用cookie获取用户名即可。

tip2: 刚开始把http.js的内容直接放到了main.js中,会出现以下问题:

每次页面刷新时,地址少个api

ajaxsetup,结合拦截器处理session过期,跳转登录页面

ajaxsetup,结合拦截器处理session过期,跳转登录页面

1.ajaxsetup------写在公用js中(每个ajax请求之后都会走这个回调) 2.拦截器设置回调的参数,或者请求状态,ajaxsetup回调参数做出处理 3、还可以自动将运行时异常,作为回调的参数(用于捕获异常,提示) session过期,session=null,要跳转登录页面。跳出iframe,分ajax请求的跳转,普通连接的跳转 package com.wondersgroup.employeeBenefits.core.author.util; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.handlerinterceptorAdapter; import com.wondersgroup.employeeBenefits.core.bases.model.User; import com.wondersgroup.employeeBenefits.core.bases.util.SpringWebHolder; public class HandlerSessionInterceptor extends handlerinterceptorAdapter {//此处一般继承handlerinterceptorAdapter适配器即可 @Override public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); HttpSession session= SpringWebHolder.getSession(); User user = (User) session.getAttribute("LOGIN_USER"); String uri = request.getRequestURI(); uri.substring(0,uri.indexOf("/",1)); String[] notFilter = new String[] { "login","validateCode","index.do","msg.do","sendmail","mailcheck","sendSMS","assign","queryDictDataByParentId","eidtcode","eidtcodemail","saveusercode"}; if (user==null)//判断session里是否有用户信息 { boolean doFilter = true; for (String s : notFilter) { if (uri.indexOf(s) != -1) { // 如果uri中包含不过滤的uri,则不进行过滤 doFilter = false; break; } } if(doFilter){ if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with") .equalsIgnoreCase("XMLHttpRequest"))//如果是ajax请求响应头会有,x-requested-with; { response.setHeader("sessionstatus","timeout");//在响应头设置session状态 response.setHeader("url",uri.substring(0,1))); }else{ PrintWriter out = response.getWriter(); StringBuilder builder = new StringBuilder(); builder.append("<script type=\"text/javascript\" charset=\"UTF-8\">"); builder.append("alert(\"页面过期,请重新登录\");"); builder.append("window.top.location.href=\""); builder.append(uri.substring(0,1))+"/login.do"); builder.append("\";</script>"); out.print(builder.toString()); out.close(); } return false; // } // response.setHeader("sessionstatus","timeout");//在响应头设置session状态 // return false; } } return true; } @Override public void postHandle(HttpServletRequest request,Object handler,ModelAndView modelAndView) throws Exception { System.out.println("===========handlerinterceptor1 postHandle"); } @Override public void afterCompletion(HttpServletRequest request,Exception ex) throws Exception { System.out.println("===========handlerinterceptor1 afterCompletion"); } ========================== 在公用的js中 /** * 设置未来(全局)的AJAX请求默认选项 * 主要设置了AJAX请求遇到Session过期的情况 */ $.ajaxSetup({ contentType:"application/x-www-form-urlencoded;charset=utf-8",error: function (XMLHttpRequest,textStatus,errorThrown){ if(XMLHttpRequest.status==403){ alert('您没有权限访问此资源或进行此操作'); return false; } },complete:function(XMLHttpRequest,textStatus){ var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); //通过XMLHttpRequest取得响应头,sessionstatus, var url=XMLHttpRequest.getResponseHeader("url"); if(sessionstatus=='timeout'){ //如果超时就处理 ,指定要跳转的页面 var top = getTopWiNow(); //获取当前页面的顶层窗口对象 alert('登录超时,请重新登录.'); top.location.href=url+"/login.do"; //跳转到登陆页面 } } }); /** * 在页面中任何嵌套层次的窗口中获取顶层窗口 * @return 当前页面的顶层窗口对象 */ function getTopWiNow(){ var p = window; while(p != p.parent){ p = p.parent; } return p; }

angular – 尝试在http拦截器中进行重定向到403错误的登录页面

angular – 尝试在http拦截器中进行重定向到403错误的登录页面

我试图制作一个http拦截器,如果附加401或403错误,它会重定向到登录页面.拦截器没问题,但是当我执行“router.navigate”时,我有一个错误:“无法读取未定义的属性’导航’”.

我的http拦截器:

@Injectable()
export class RedirectHttp extends Http {
constructor(protected backend: ConnectionBackend,protected defaultOptions: RequestOptions,private router: Router,private loginUrl: string) {
    super(backend,defaultOptions);
}

...

intercept(observable: Observable<Response>): Observable<Response> {
    return observable.catch(this.handleError) as Observable<Response>;
}

private handleError(error: any): any {
    if (error.status === 401 || error.status === 403 && !error.url.endsWith("/" + this.loginUrl)) {
        this.router.navigate([this.loginUrl]);
        return Observable.empty();
    } else {
        return Observable.throw(error);
    }

}

}

application.Module.ts上的声明:

@NgModule({
    declarations: [...],entryComponents: [...],imports: [
        browserModule,routing,FormsModule,ReactiveFormsModule,HttpModule,],providers: [
        appRoutingProviders,{provide: Http,useFactory: (xhrBackend: XHRBackend,requestOptions: RequestOptions,router: Router) => new RedirectHttp(xhrBackend,requestOptions,router,LOGIN.path),deps: [XHRBackend,RequestOptions,Router]
        }
    ],bootstrap: [ApplicationApp]
})
export class AppModule {
}

我认为路由器注入有一个错误,但我找不到.

解决方法

我有同样的问题,唯一帮助我重定向的是:

intercept(observable: Observable<Response>): Observable<Response> {
    return observable.catch((error) => {
        if (error.status === 401 || error.status === 403) {
            this.router.navigate([this.loginUrl]);
        }
        return this.handleError(error);
    });
}

discuz 怎样判断用户登录状态比价好?

discuz 怎样判断用户登录状态比价好?

现制作一个discuz 游客未登录的提醒,对用户是否登录的判断php代码如下:



require ''./source/class/class_core.php'';  
$discuz = & discuz_core::instance();  
$discuz->cachelist = $cachelist;  
$discuz->init();  

	    global $_G;
		if(!$_G[''uid'']){

			     include ''./templat/某.htm'';
		}



?>


结果在IE6/7(360)中出现判断失效的问题,即便用户已完成登陆,仍然判断用户未登录并显示登陆提醒

chrome,ff,IE9以上均无问题,用户登陆后提示即不再显示

请教下是否有更好的判断discuz用户登录状态的方法和具体实现,谢谢




Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页

Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页

背景:

  文章详情页正在查看文章,想评论一下写的不错,但是需要先登录才能。页面长这个样子:

 

方案:

 

  1、点击登录链接时,将该页面的URL传递到登录视图中

    request.path获取的是当前页面的相对路径

<a href="{% url ''account:user_login'' %}?cur_url={{ request.path }}">登录</a>后回复

  登录时的URL如下图,会带上之前页面的相对url

 

 

 

  2、在登录视图中获取该cur_url的值,等待登录成功后跳转

def user_login(request):
    # 定义为全局变量,post登录请求后依然可以使用该变量进行跳转
    global cur_url
    if request.method == ''GET'':
        # 获取从url传递来的登录前的url
        cur_url = request.GET.get(''cur_url'')
        login_form = LoginForm()
        return render(request, "account/login2.html", {"form": login_form})

    if request.method == ''POST'':

        #request.POST将前台数据传递给表单类,生成一个绑定实例
        login_form = LoginForm(request.POST)
        #如果数据合法则进行数据清洗,返回输入的数据(字典格式)
        if login_form.is_valid():
            cd = login_form.cleaned_data
            # 如果给定的凭据有效则返回一个User对象,否则返回None
            user = authenticate(username=cd[''username''], password=cd[''password''])

            if user:
                #如果user不为None(既通过了凭据验证返回了user对象),使用系统自带的login方法登录
                login(request, user)
            else:
                error_msg = "账号与密码不匹配"
                return render(request, ''account/login2.html'', {''form'': login_form, ''error_msg'': error_msg})
        else:
            error_msg = ''请输入合法数据''
            return render(request, ''account/login2.html'', {''form'': login_form, ''error_msg'': error_msg})


        # 设置session信息
        request.session[''is_login''] = True
        request.session[''username''] = cd[''username'']
        #设置session有效期为?秒,不管操作不操作系统,10秒后都会自动失效
        # request.session.set_expiry(6000)

        # 校验成功后跳转至登录前的页面
        return redirect(cur_url)

  

 

今天关于vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面http拦截器的分享就到这里,希望大家有所收获,若想了解更多关于ajaxsetup,结合拦截器处理session过期,跳转登录页面、angular – 尝试在http拦截器中进行重定向到403错误的登录页面、discuz 怎样判断用户登录状态比价好?、Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页等相关知识,可以在本站进行查询。

本文标签: