angularjs+jfinal 登录认证不通过时应该用什么?

tokihou 发布于 2015/06/08 13:12
阅读 803
收藏 0

LoginInterceptor.java

public void intercept(ActionInvocation ai) {
		BaseController c = (BaseController) ai.getController();
		HttpServletRequest request = c.getRequest();
		log.info("获取当前用户!");
		HttpSession session = request.getSession();
		User loginUser = c.getSessionAttr("loginUser");
		session.getAttribute("loginUser");

		if (loginUser == null) {
			c.redirect("/login");
			return;
		}

		try {
			ai.invoke();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}



angularjs的router.js

$stateProvider.state("index", {
		url : "/index",
		templateUrl : "app/views/hello/pageTab.html",
		controller : 'pageController'
	}).state("login", {
		url : "/login",
		templateUrl : "app/views/login/login.html",
		controller : 'loginctrl'
	})



拦截器中用redirect好像是直接请求controller了,这样会造成循环重复请求。

redirect时,应该用url还是html?貌似html不能渲染。

有没有朋友用angularjs+jfinal做项目的? 登录功能这里的路由应该怎么做?

加载中
0
xialeistudio
xialeistudio

引用来自“xialeistudio”的评论

接口化开发你发送一个重定向是几个意思?

登录失败直接返回Json给前台提示 登录失败就好了。

未授权访问API的话,直接返回HTTP 401或者403

引用来自“tokihou”的评论

谢谢,钻牛角尖了,开窍了!
最佳答案~
0
xialeistudio
xialeistudio

接口化开发你发送一个重定向是几个意思?

登录失败直接返回Json给前台提示 登录失败就好了。

未授权访问API的话,直接返回HTTP 401或者403

0
t
tokihou

引用来自“xialeistudio”的评论

接口化开发你发送一个重定向是几个意思?

登录失败直接返回Json给前台提示 登录失败就好了。

未授权访问API的话,直接返回HTTP 401或者403

谢谢,钻牛角尖了,开窍了!
0
玛雅牛
玛雅牛

angularjs的话,服务前端返回json结果,控制权主要在浏览器端实现。提供几段代码,希望对你有用:
1)

AjaxReturn.java ,返回给客户端的对象

public class AjaxReturn {
    public static final int ERR_CODE_OK = 200; 
    public static final int ERR_CODE_NOT_FOUND = 204; 
    public static final int ERR_CODE_ERROR = 500;
    public static final int ERR_CODE_UNAUTHORIZED=401;
    /**
     * 处理是否成功,true成功,false失败
     */
    private boolean ok  = true ;
    
    /**
     * 返回代码,默认为200,表示处理正常,主要用于发生错误时的错误代码
     */
    private int   code  = ERR_CODE_OK;
    
    /**
     * 是否需要登录
     */
    private boolean needLogin = false;
    
    /**
     * 消息,成功/失败时返回的消息
     */
    private String msg  = "";
    
    /**
     * 返回数据数据。
     */
    private Object data = null ;

    /**  
     * @return ok 
     * @since V1.0.0 
     */
    public final boolean isOk() {
        return ok;
    }
    
    /**
     * @Title: setNeedLogin  
     * @Description: 设定需要登录
     * @return 
     * @since V1.0.0
     */
    public final AjaxReturn setNeedLogin(){
    	this.needLogin = true;
    	this.ok = false;
    	this.code = ERR_CODE_UNAUTHORIZED;
    	return this;
    }

    /**  
	 * @return needLogin 
	 * @since V1.0.0 
	 */
	public final boolean isNeedLogin() {
		return needLogin;
	}

	/**  
     * @param ok  要设定的ok  
     * @since V1.0.0
     */
    public final AjaxReturn setOk(boolean ok) {
        this.ok = ok;
        return this;
    }

    /**  
     * @return code 
     * @since V1.0.0 
     */
    public final int getCode() {
        return code;
    }
    
    /**  
     * @param code  要设定的code  
     * @since V1.0.0
     */
    public final AjaxReturn setCode(int code) {
        this.code = code;
        return this;
    }

    /**  
     * @return msg 
     * @since V1.0.0 
     */
    public final String getMsg() {
        return msg;
    }

    /**  
     * @param msg  要设定的msg  
     * @since V1.0.0
     */
    public final AjaxReturn setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    /**  
     * @return data 
     * @since V1.0.0 
     */
    public final Object getData() {
        return data;
    }

    /**  
     * @param data  要设定的data  
     * @since V1.0.0
     */
    public final AjaxReturn setData(Object data) {
        this.data = data;
        return this;
    }
}



2)Ajax(AjaxReturn工厂类)
public class Ajax {
    /**
     * <p>Title: Ajax</p>  
     * <p>Description: 构造函数,禁止初始化</p>  
     * @since V1.0.0
     */
    private Ajax(){
    }
    
    /**
     * @Title: unauthorized  
     * @Description: 访问受限
     * @return 
     * @since V1.0.0
     */
    public static AjaxReturn unauthorized() {
    	//无权访问
        return new AjaxReturn().setNeedLogin();
    }
    
    /**
     * @Title: ok  
     * @Description: 创建一个成功的AjaxReturn(附带数据和消息) 
     * @param okMsg 处理成功的消息
     * @param data 返回的数据
     * @return  AjaxReturn
     * @since V2.0.0
     */
    public static AjaxReturn ok(Object data, String okMsg) {
        return new AjaxReturn().setOk(true).setCode(AjaxReturn.ERR_CODE_OK).setData(data).setMsg(okMsg);
    }
    
    /**
     * @Title: ok  
     * @Description: 创建一个成功的AjaxReturn(仅数据)
     * @param data 返回的数据
     * @return  AjaxReturn
     * @since V2.0.0
     */
    public static AjaxReturn ok(Object data) {
        return ok(data,null);
    }
    
    /**
     * @Title: ok  
     * @Description: 创建一个成功的AjaxReturn(data默认为null) 
     * @return  AjaxReturn
     * @since V1.0.0
     */
    public static AjaxReturn ok() {
        return ok(null,null);
    }
    
    /**
     * @Title: ok  
     * @Description: 创建一个无数据的AjaxReturn 
     * @return  AjaxReturn
     * @since V1.0.0
     */
    public static AjaxReturn notFound() {
        return new AjaxReturn().setOk(true).setCode(AjaxReturn.ERR_CODE_NOT_FOUND);
    }

    /**
     * @Title: fail  
     * @Description: 创建一个附带错误消息的失败的AjaxReturn
     * @param code   状态码(整数)
     * @param errorMsg   错误消息
     * @return  AjaxReturn
     * @since V2.0.0
     */
    public static AjaxReturn fail(int code, String errorMsg) {
        return new AjaxReturn().setOk(false).setCode(code).setMsg(errorMsg);
    }
    
    /**
     * @Title: fail  
     * @Description: 创建一个附带错误消息的失败的AjaxReturn(状态码为默认的错误码) 
     * @param errorMsg   错误消息
     * @return  AjaxReturn
     * @since V1.0.0
     */
    public static AjaxReturn fail(String errorMsg) {
        return fail(AjaxReturn.ERR_CODE_ERROR,errorMsg);
    }
}



3)实际使用代码。
AjaxReturn ret = Ajax.ok().setMsg("新建成功").setData(m.getId());
this.renderJson(ret);



angularjs浏览器端使用router的话可以这么做:
//全局路由权限控制
app.run(function ($rootScope, $location, SessionService) {
    $rootScope.$on('$stateChangeStart', function (event, toState, toStateParams) {
        $rootScope.toState = toState;
        $rootScope.toStateParams = toStateParams;
        //已经登录情况,直接返回。
        if(SessionService.isLogin()){
            return;
        }
        if(toState.data.requiredAuth){$location.path("/member/login");} 
    });
});

//每个路径使用requiredAuth来定义是否需要登录。
app.config(function ($stateProvider) {
    $stateProvider
            .state('phone', {
                url: "/phone",
                cache:false,
                data: {requiredAuth: false},
                templateUrl: "templates/phone.html",
                controller: 'PhoneController'
            });
});

以上是本人在实际中的一点小经验,希望对你有用,欢迎指正。

t
tokihou
非常感谢!
返回顶部
顶部