如果您对vue根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于vue根据接口返回的状态码判断用户登录状态
如果您对vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面的详细内容,我们还将为您解答http拦截器的相关问题,并且为您提供关于ajaxsetup,结合拦截器处理session过期,跳转登录页面、angular – 尝试在http拦截器中进行重定向到403错误的登录页面、discuz 怎样判断用户登录状态比价好?、Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页的有价值信息。
本文目录一览:- vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)
- ajaxsetup,结合拦截器处理session过期,跳转登录页面
- angular – 尝试在http拦截器中进行重定向到403错误的登录页面
- discuz 怎样判断用户登录状态比价好?
- Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页
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过期,跳转登录页面
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错误的登录页面
我的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 游客未登录的提醒,对用户是否登录的判断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:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页
背景:
文章详情页正在查看文章,想评论一下写的不错,但是需要先登录才能。页面长这个样子:
方案:
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:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页等相关知识,可以在本站进行查询。
本文标签: