我的页面都做了登陆判断,我写了一个Basecontroller,下面的controller都继承它,实现了登陆之前判断
namespace MVC_DEMO.Controllers { public class BaseController : Controller { // // GET: /Base/ protected override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); if (Session["user"] == null) { filterContext.Result = Redirect("/Account/Login"); } } } }
但是输入指定页面的URL验证登陆后,跳转的是默认页,怎样可以跳转到之前输入的URL。
我们是这样处理的。
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { string path = filterContext.HttpContext.Request.Path; var routeValue = new RouteValueDictionary { {"Controller", "Account"}, {"Action", "Login"}, {"ReturnUrl", path} }; filterContext.Result = new RedirectToRouteResult(routeValue); return; }
像我这样用controller继承的方法实现 可以这样写吗
@sucheng1992: 实际就是能取到returnurl就可以了吧.
@DysonDu: filterContext.Result = Redirect("/Account/Login?returnurl=/Home/Index");这样写对吗
可以用ajax请求,请求成功的话 return 结果,然后js中判断,if成功,跳转登陆页
我的意思是我比如输入/HOME/INDEX,这不是我没登陆吗,跳转到登录页/HOME/LOGIN,当我完成LOGIN之后返回到我之前输入的/HOME/INDEX该怎么做
@sucheng1992: 我是下面这个意思
$.post("/home/login", parms, loginResponse); //处理登录的反馈信息 function loginResponse(data) { var result = eval("(" + data + ")"); if (result.state == "success") { window.location.href = "/home/index"; } } //后台处理 public ActionResult Login() { string state = "success"; //验证成功后 return Content(string.Format("{0}\"state\":\"{1}\"", "{", state, "}")); } 我是上面这个意思
return RedirectToAction("路径",参数),这个可以么
用一个参数将当前地址传过去
上面说有存路由其实都不安全,因为参数,分布式服务器,跨域服务,都会有问题,最好的方式就是跳转到你登陆界面的时候就带上原来的地方(一定要用js取,js取浏览器中的地址才是最准确最安全的,其它的都有可能取错),然后进行登陆,登陆成功,回执一个登陆成功的界面,然后在这个界面里面的<script>中写上setTimeOut,1000毫秒后跳转你之前取的地址location.href="你之前用js取的地址"。这样,从JS取的地址由JS跳转,只是中间走服务器暂存了一圈,才原汁原味!
不在路由里保存的话,js取的地址如何保留到后面的页面的呢,是不是存cookie里?
“中间走服务器暂存一圈”是怎么存的,不懂?
@天婴: 不用保存,直接放在URL里面作为参数带到后台,然后后台再给再回来。之所以不推荐用COOKIE的原因是有的平台有的条件下,是不允许 使用COOKIE的,但是URL只要是WEB都要被支持。